2015-01-05 4 views
1

Какой метод поиска элементов в одной коллекции на основе значения свойства каждого элемента в другой коллекции лучше? Помимо этого, есть ли лучший способ сделать это?Что более эффективно/элегантно?

List<Thing> results;  

List<Thing> thingList1 = ...; 
List<Thing> thingList2 = ...; 

Метод A:

results = thingList1.Where(x => thingList2.Any(y => y.Id == x.Id)).ToList(); 

Метод B:

foreach (Thing thing in thingList1) 
{ 
    results.AddRange(thingList2.Where(x => x.Id == thing.Id).Select(y => thing)); 
}  

?

+3

Возможно, вы должны использовать 'Intersect' – leppie

+1

Определите« лучше ». Это работает? Он работает достаточно быстро? – CodeCaster

+0

@CodeCaster - Я надеялся получить мнения и оправдания. – Corpsekicker

ответ

1

я выбрал бы сделать присоединиться:

var results = (from item1 in thingList1 
       join item2 in thingList2 
       on item1.Id equals item2.Id 
       select item1).ToList(); 

Я думаю, что выше подход более ясно, что это намерение.

Другой вариант, это было бы использовать метод Intersect:

var results = thingList1.Intersect(thingList2); 

Это более элегантно. Однако вам следует обратить внимание на реализацию интерфейса IEquatable<Thing> для вашего класса Thing. В противном случае вы не сможете его использовать. Для получения дополнительной информации, пожалуйста, посмотрите here.

0

Лучший способ узнать, написать тест с реальными данными, однако вы делаете то, что в списке несколько раз. Создание словаря из списка даст вам лучшую производительность.

Dictionary<int, thing> d = thingList2.ToDictornary(x => x.Id); 
foreach (Thing thing in thingList1) 
{ 
    results.Add(d[thing.Id]); 
}  
Смежные вопросы