У меня есть классы:
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();
который все еще занимает много времени... Что я делаю неправильно?