Неважно, какую структуру данных вы используете в качестве ключа, если ключ содержит необходимую информацию для компаратора для правильного сравнения / хеширования.
Вы даже можете использовать свои объекты в качестве ключей в словареи сравните по любому полю с подходящей 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>
{
//Change this if you need e.g. case insensitivity or
//culture-specific comparisons
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)
{
//Uncomment this if running in a checked context
//Copycat of Jon Skeet's string hash combining
//unchecked
//{
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>
.
Обратите внимание, что я использовал метод Джона Скита для объединения строковых хэшей.Это может быть лучше, чем метод XOR, найденный в MSDN .Если вы чувствуете, что это неадекватно стали, не стесняйтесь обращаться со строками с помощью другой хэш-реализации - Се * , Ропот , Боба Дженкина , или что вы веритеВот отличная страница о хеш-функциях , которая также имеет некоторый код C #.