Linq Union - IEqualityComparer и количество казней - PullRequest
0 голосов
/ 16 июня 2011

Интересно, как работает GetHashCode конкретной реализации IEqualityComparer?

Причина, по которой я спрашиваю, заключается в том, что я использую linq для объединения двух коллекций, и когда только левая коллекция имеет элемент, GetHashCode вызывается дважды.Кроме того, он вызывается четыре раза, если обе коллекции имеют одну строку.

Это грубая печать, но вы поймете.GetHashCode вызывается дважды, что, я думаю, дважды для одного элемента в listOne?

например,

var listOne = new List<SearchResult>{new SearchResult{Name="Blah"}}; 
var listTwo = new List<SearchResult>(); 

listOne.Union(listTwo, SearchResultComparer); 

public class SearchResultComparer : IEqualityComparer<SearchResult>
{
   public bool Equals(SearchResult x, SearchResult y){....}

   public int GetHashCode(SearchResult obj)
   {
       unchecked
       {
           int result = 0;
           result = (result * 397) ^ (obj.Name != null ?                 
           return result;
       }
   }

}

Спасибо

1 Ответ

0 голосов
/ 16 июня 2011

Мне любопытно ваше наблюдение, я могу наблюдать только одну проверку GetHashCode для каждого из пунктов в каждом списке. Но что касается реализации Union с использованием вашего компаратора, подумайте об этом так:

static IEnumerable<T> Union<T>(this IEnumerable<T> first, IEnumerable<T> second, IEqualityComparer<T> comparer)
{        
    // there's undoubtedly validation against null sequences

    var unionSet = new HashSet<T>(comparer);

    foreach (T item in first)
    {
        if (unionSet.Add(item))
            yield return item;
    }

    foreach (T item in second)
    {
        if (unionSet.Add(item))
            yield return item;
    }
}

Add метод HashSet вернет true или false, если элемент может быть добавлен. Во внутренней реализации он вызовет элемент GetHashCode и получит значение, а затем увидит, существует ли это значение внутри коллекции. Если это так, он сравнивает каждый с соответствующим хеш-кодом на равенство. Если совпадения не существует (или если хеш-код еще не существует), элемент успешно добавляется, и метод возвращает значение true. В противном случае элемент не добавляется, и метод возвращает значение false.

...