Список С# в качестве словаря
У меня есть словарь, который вводится с помощью списка:
private Dictionary<List<custom_obj>, string> Lookup;
Я пытаюсь использовать ContainsKey, но он, похоже, не работает, и я понятия не имею, почему.
Вот отладочная информация из окна Visual Studio Immediate:
?Lookup.Keys.ElementAt(7)[0]
{custom_obj}
Direction: Down
SID: 2540
?Lookup.Keys.ElementAt(7)[1]
{custom_obj}
Direction: Down
SID: 2550
searchObject[0]
{custom_obj}
Direction: Down
SID: 2540
searchObject[1]
{custom_obj}
Direction: Down
SID: 2550
?Lookup.ContainsKey(searchObject)
false
В моем здравом смысле этот последний ContainsKey должен быть правдой. Надеюсь, я включил здесь достаточно информации... любые идеи?
Спасибо!
Ответы
Ответ 1
Экземпляр List<custom_obj>
, действующий как ключ, ссылается неравномерно на экземпляр, на который ссылается searchObject.
Если вы хотите, чтобы словарь использовал значения в списке вместо ссылочного равенства для поиска соответствующих ключей, вы должны предоставить IEqualityComparer в конструкторе словаря (< поскольку вы не можете переопределить Equals и GetHashCode в List<T>
).
Ответ 2
У вас есть два отдельных List
, которые содержат одни и те же элементы. Правильный способ узнать, равны ли два списка, - это метод SequenceEqual
.
По умолчанию вы не можете делать то, что вы пытаетесь сделать. Однако вы можете написать пользовательский IEqualityComparer
и передать его в конструктор Dictionary
.
Ниже приведен пример шаблона IEqualityComparer
:
class ListComparer<T> : IEqualityComparer<List<T>>
{
public bool Equals(List<T> x, List<T> y)
{
return x.SequenceEqual(y);
}
public int GetHashCode(List<T> obj)
{
int hashcode = 0;
foreach (T t in obj)
{
hashcode ^= t.GetHashCode();
}
return hashcode;
}
}
Вы можете улучшить реализацию GetHashCode
, так как это было быстро и грязно.
Ответ 3
Это будет работать, только если фактический экземпляр списка, используемый в поиске, совпадает с экземпляром, который был добавлен в качестве ключа. Он не будет сравнивать содержимое списка. Это то же поведение, которое вы получите, если попытаетесь напрямую сравнить два объекта List.
Ответ 4
Вы уверены, что экземпляр, который вы используете в вашем методе поиска, - это тот же самый экземпляр, который входит в число ваших ключей словаря? Это единственное, о чем я могу думать.