2011-02-10 13 views

Odpowiedz

1

Sprawdzanie wpis MSDN Dictionary.Keys Property:

Kolejność klawiszy w Dictionary.KeyCollection jest nieokreślona, ​​ale to jest taka sama jak kolejność skojarzone wartości w Dictionary.ValueCollection zwrócone przez właściwość Values.

+0

Czy to prawda, że ​​SortedDictionary ma określoną kolejność na klawiszach? –

+0

@RayCheng Dokumentacja, którą zacytowałem, odnosi się do klasy "Dictionary". Aby odpowiedzieć na twoje pytanie, musisz sprawdzić dokumentację dla 'SortedDictionary.Keys', która mówi" Klucze w 'SortedDictionary .KeyCollection' są posortowane według właściwości' Comparer' i są w tej samej kolejności jako wartości skojarzone w 'SortedDictionary .ValueCollection' zwrócone przez właściwość' Values'. " Tak więc odpowiedź na twoje pytanie brzmi * tak *. – CodesInChaos

6

powiedziałbym tak na tej podstawie od MSDN:

Kolejność wartości w Dictionary.ValueCollection jest nieokreślona, ​​ale jest tego samego rzędu co powiązanych kluczy w Dictionary.KeyCollection zwracane przez właściwość Keys.

+1

+1: za wzmiankę o MSDN najpierw – Simon

0

W kodzie - tak. Ale jeśli zastąpisz GetHashCode() w klasie U, a następnie wprowadzisz pewne zmiany, które zmienią wartość GetHashCode() i wywołają Assert, możliwe, że będzie ona fałszywa, ponieważ słownik jest zaimplementowany jako tablica asocjacyjna. Kolejny kod zwraca fałsz:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<A, int> d = new Dictionary<A, int>(); 
      for (int i = 1; i <= 10; i++) 
      { 
       d.Add(new A { Hash = i}, i); 
      } 
      DictionaryTest(5, d); 
     } 

     public static void DictionaryTest(int i, Dictionary<A, int> dict) 
     { 
      A key = dict.Keys.ToList()[i]; 
      key.Hash = 4; 
      Console.WriteLine(dict[key].Equals(dict.Values.ToList()[i])); 
      Console.ReadKey(); 
     } 
    } 

    public class A 
    { 
     public int Hash { get; set; } 

     public override bool Equals(object obj) 
     { 
      return this.GetHashCode() == obj.GetHashCode(); 
     } 
     public override int GetHashCode() 
     { 
      return Hash; 
     } 
    } 
+1

Jeśli naruszasz umowę "Słownika", otrzymujesz niezdefiniowane zachowanie. Niespodzianka niespodzianka. "Dopóki obiekt jest używany jako klucz w Słowniku , nie może zmieniać się w żaden sposób, który wpływa na jego wartość skrótu." – CodesInChaos

+0

Nie będzie to fałsz, ponieważ kolejność wpisów będzie inna, ale znowu taka sama. –

+0

Ale jest to możliwe i niektórzy ludzie popełnili ten błąd. Zastępują metodę GetHashCode() i używają obiektów ze Słownikiem. – Rover

0

Reflektor mówi, że w Framework 2.0 - 4.0 zarówno KeyCollection i ValueCollection są wyliczanie nad kolekcji dictionary.entries. Dlatego kolejność będzie taka sama. A tak przy okazji, ta sama kolejność będzie dotyczyła wyliczenia samego słownika (KeyValuePairs).

+0

Ważne jest, aby nie tylko obecna implementacja tego dokonała, ale gwarantowała to umowa "Klucze" i "Wartości". Inaczej może się to różnić w przyszłych wersjach lub różnych implementacjach. – CodesInChaos

+0

Cóż, specyfikacja może ulec zmianie również w przyszłych wersjach. Właśnie powiedziałem, jak to teraz zostało wprowadzone i dlaczego zamówienie to samw. –

Powiązane problemy