怎么能转换为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);
怎么能转换为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);
你可以做这样的事情:
list1.ForEach(x => { list2.Remove(x); });
您可以使用Except()
:
list2 = list2.Except(list1)
.ToList();
这也将执行比你原来的代码更好,因为你的代码是O(n )对第一个集合中的所有项目进行循环,然后尝试查找第二个集合中的第一个匹配项。 (虽然承认,如果你的收藏品很小,性能差异并不重要,但对于大型收藏品来说这将会很重要)。
Except()
将在内部创建list1
的HashSet<int>
,然后只是遍历list2
集合。只有HashSet
中未包含的项才会在结果枚举中结束 - 因为HashSet
查找的平均值为O(1),所以总共将导致O(n)的努力。
对于教育复习,请参阅Jon Skeets EduLinq系列,这里的chapter for Except。
+1感谢您的精彩解释。我每天都会在SO上学到新东西。 – 2012-04-12 13:10:16
list2.RemoveAll(m=>list1.Contains(m));
IEnumerable.Except()。 – 2012-02-07 18:57:49