It doesn’t matter what data structure you use as a key, as long as the key stores the necessary information for comparison with the corresponding comparison / hash.
, , EqualityComparer. :
class MyObject
{
public string StringProp1 { get; set; }
public string StringProp2 { get; set; }
public MyObject(string prop1, string prop2)
{
StringProp1 = prop1;
StringProp2 = prop2;
}
}
class MyObjectComparerS1S2 : EqualityComparer<MyObject>
{
static StringComparer comparer = StringComparer.Ordinal;
public override bool Equals(MyObject x, MyObject y)
{
return
comparer.Equals(x.StringProp1, y.StringProp1) &&
comparer.Equals(x.StringProp2, y.StringProp2);
}
public override int GetHashCode(MyObject obj)
{
return
(527 + comparer.GetHashCode(obj.StringProp1)) * 31 +
comparer.GetHashCode(obj.StringProp2);
}
public static readonly MyObjectComparerS1S2 Instance =
new MyObjectComparerS1S2();
}
static void Main(string[] args)
{
Dictionary<MyObject, MyObject> dict =
new Dictionary<MyObject, MyObject>(MyObjectComparerS1S2.Instance);
MyObject obj = new MyObject("apple", "plum");
dict.Add(obj, obj);
MyObject search = new MyObject("apple", "plum");
MyObject result = dict[search];
Console.WriteLine("{0}:{1}", result.StringProp1, result.StringProp2);
}
, , .
, , @Vlad . EqualityComparer<MyKeyStructOrClass>.
, Jon Skeet . , XOR, MSDN. , , - Hsieh, Murmur, . -, #.