как работает метод exclude в linq

У меня есть классы:

class SomeClass
{
   public string Name{get;set;}
   public int SomeInt{get;set;}
}


class SomeComparison: IEqualityComparer<SomeClass>
{
     public bool Equals(SomeClass s, SomeClass d)
     {
         return s.Name == d.Name;
     }

     public int GetHashCode(SomeClass a)
     {
         return (a.Name.GetHashCode() * 251);
     }
}

У меня также есть два больших List<SomeClass>с именами list1и list2

, прежде чем у меня был :

 var q = (from a in list1
         from b in list2
         where a.Name != b.Name
         select a).ToList();

, и это заняло около 1 минуты на выполнение. Теперь у меня :

var q =  list1.Except(list2,new SomeComparison()).ToList();

, и это занимает менее 1 секунды!

Я хотел бы понять, что делает метод Except. Создает ли метод хэш-таблицу каждого списка, а затем выполняет такое же сравнение? Если я буду выполнять много таких сравнений, должен ли я вместо этого создать Hashtable?


РЕДАКТИРОВАТЬ

Теперь вместо списков у меня есть два HashSet<SomeClass>с именами hashSet1и hashSet2

, когда я делаю :

   var q = (from a in hashSet1
           form b in hashSet2
           where a.Name != b.Name
           select a).ToList();

, это все еще занимает много времени... Что я делаю неправильно?

12
задан Tono Nam 22 April 2012 в 16:40
поделиться