比较两个列表与LINQ的更好方法?

时间:2010-08-09 16:29:44

标签: c# linq custom-lists

我有两个系列:

IEnumerable<Element> allElements
List<ElementId> someElements, 

一起完成以下操作的简洁方法是什么:

[1]验证someElements中的所有元素都存在于allElements中,当条件失败时快速返回。

[2]获取Element映射到的List<ElementId> someElements个对象的列表。

每个Element对象都有一个ElementId

谢谢。

3 个答案:

答案 0 :(得分:9)

我会这样做:

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 :(得分:1)

  1. someElements.All(e => allElements.Contains(e));
  2. allElements.Where(e => someElements.Contains(e.ElementId));

答案 2 :(得分:1)

不像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);
}