我有 2 个字符串类型列表:
- List1 有项目 - item1, item2, item3
- List2 有项目 - item2, item3
现在我需要比较两个列表并从中删除重复的项目List1
。修改后List1
应该只有一项,即“item1”。
foreach 循环可能有效,但我想知道是否有任何内置方法可以做到这一点?
编辑
谢谢你们的答案。我只是在想如果我想将错过的项目添加到列表中会怎样。所以刚刚提出了另一个类似的问题。
蒂亚!
我有 2 个字符串类型列表:
现在我需要比较两个列表并从中删除重复的项目List1
。修改后List1
应该只有一项,即“item1”。
foreach 循环可能有效,但我想知道是否有任何内置方法可以做到这一点?
谢谢你们的答案。我只是在想如果我想将错过的项目添加到列表中会怎样。所以刚刚提出了另一个类似的问题。
蒂亚!
你可以使用:
list1.RemoveAll(item => list2.Contains(item));
(正如 Marc 所说,这是 O(N*M) - 如果您希望列表非常短,那很好,但如果它们中的任何一个变得很大,那就太糟糕了。)
或者,如果您不介意它是一个新列表(而不是修改现有列表),您可以使用:
list1 = list1.Except(list2).ToList();
我怀疑在这里使用的最佳方法是首先将第二个列表放入哈希中,即
var hash = new HashSet<TheType>(List2);
List1.RemoveAll(hash.Contains);
这避免了 O(n*m) 的性能,而不是 O(n+m)
例子:
List<int> List1 = new List<int> {1,2,3};
List<int> List2 = new List<int> {2,3};
var hash = new HashSet<int>(List2);
List1.RemoveAll(hash.Contains);
// now List1 just has {1}
利用
List1 = List1.Except(List2).ToList();
我建议使用:
List1 = List1.Except(List2).ToList();