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;
}
}
Czy to prawda, że SortedDictionary ma określoną kolejność na klawiszach? –
@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