2012-02-07 55 views
2

怎么能转换为LINQ或谓词表达式如下代码:LINQ查询形式

List<int> list1 = new List<int> {1,2,3,4,5}; 
List<int> list2= new List<int> {2,3,4,5,6,7}; 
foreach (int int1 in list1) 
list2.Remove(int1); 
+2

IEnumerable.Except()。 – 2012-02-07 18:57:49

回答

0

你可以做这样的事情:

list1.ForEach(x => { list2.Remove(x); }); 
9

您可以使用Except()

list2 = list2.Except(list1) 
      .ToList(); 

这也将执行比你原来的代码更好,因为你的代码是O(n )对第一个集合中的所有项目进行循环,然后尝试查找第二个集合中的第一个匹配项。 (虽然承认,如果你的收藏品很小,性能差异并不重要,但对于大型收藏品来说这将会很重要)。

Except()将在内部创建list1HashSet<int>,然后只是遍历list2集合。只有HashSet中未包含的项才会在结果枚举中结束 - 因为HashSet查找的平均值为O(1),所以总共将导致O(n)的努力。

对于教育复习,请参阅Jon Skeets EduLinq系列,这里的chapter for Except

+0

+1感谢您的精彩解释。我每天都会在SO上学到新东西。 – 2012-04-12 13:10:16

1
list2.RemoveAll(m=>list1.Contains(m));