Лучший способ сравнить два списка с LINQ? - PullRequest
1 голос
/ 09 августа 2010

У меня есть 2 коллекции:

IEnumerable<Element> allElements
List<ElementId> someElements, 

Что является кратким способом сделать следующее вместе:

[1] Проверка того, что все элементы в someElements существуют в allElements, быстро возвращаться при сбое условия.

и

[2] Получите список Element объектов, с которыми List<ElementId> someElements отображается.

Каждый Element объект имеет ElementId

Спасибо.

Ответы [ 3 ]

9 голосов
/ 09 августа 2010

Я бы сделал это:

var map = allElements.ToDictionary(x => x.Id);    
if (!someElements.All(id => map.ContainsKey(id))
{
    // Return early
}
var list = someElements.Select(x => map[x])
                       .ToList();

Обратите внимание, что в первой строке будет сгенерировано исключение, если в allElements.

есть дубликаты.
1 голос
/ 09 августа 2010

Не так эффективно, как ответ Skeet, но достаточно хорошо для коллекций разумного размера:

IEnumerable<Element> allElements = new List<Element>
    { new Element { Id = 1 }, new Element { Id = 2 } };
List<int> someElements = new List<int> { 1, 2 };

var query =
    (from element in allElements
    join id in someElements on element.Id equals id
    select element)
    .ToList();

if (query.Count != someElements.Count)
{
    Console.WriteLine("Not all items found.");
}

foreach (var element in query)
{
    Console.WriteLine ("Found: " + element.Id);
}
1 голос
/ 09 августа 2010
  1. someElements.All(e => allElements.Contains(e));
  2. allElements.Where(e => someElements.Contains(e.ElementId));
...