2010-08-09 106 views
1

我有2個集:比較兩個列表與LINQ的更好方法?

IEnumerable<Element> allElements 
List<ElementId> someElements, 

是什麼做的簡潔的方式一起如下:

[1]驗證是否在someElements所有元素allElements存在,迅速返回時的條件失敗。

[2]獲得Element對象List<ElementId> someElements映射到的列表。

每個Element對象都有一個ElementId

謝謝。

回答

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任何重複的第一行會拋出異常。

+0

這是真棒解決方案,這清楚地表明,在使用LINQ人們仍然需要理解的複雜性和其他基本算法的東西。但對於小列表來說,它可能是一個開銷。 – Andrey 2010-08-09 16:40:36

+1

如果有重複,MoreLinq的DistinctBy方法會派上用場:http://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/DistinctBy.cs – tvanfosson 2010-08-09 17:24:55

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

效率不高的飛碟雙向的答案,但對於合理大小的集合不夠好:

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