Подтвердить что ты не робот

Список С# в качестве словаря

У меня есть словарь, который вводится с помощью списка:

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 должен быть правдой. Надеюсь, я включил здесь достаточно информации... любые идеи?

Спасибо!

4b9b3361

Ответ 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

Вы уверены, что экземпляр, который вы используете в вашем методе поиска, - это тот же самый экземпляр, который входит в число ваших ключей словаря? Это единственное, о чем я могу думать.