2

我有 2 个字符串类型列表:

  • List1 有项目 - item1, item2, item3
  • List2 有项目 - item2, item3

现在我需要比较两个列表并从中删除重复的项目List1。修改后List1应该只有一项,即“item1”。

foreach 循环可能有效,但我想知道是否有任何内置方法可以做到这一点?

编辑

谢谢你们的答案。我只是在想如果我想将错过的项目添加到列表中会怎样。所以刚刚提出了另一个类似的问题。

在 List<string> 中添加操作

蒂亚!

4

4 回答 4

10

你可以使用:

list1.RemoveAll(item => list2.Contains(item));

(正如 Marc 所说,这是 O(N*M) - 如果您希望列表非常短,那很好,但如果它们中的任何一个变得很大,那就太糟糕了。)

或者,如果您不介意它是一个列表(而不是修改现有列表),您可以使用:

list1 = list1.Except(list2).ToList();
于 2012-08-03T13:31:17.043 回答
10

我怀疑在这里使用的最佳方法是首先将第二个列表放入哈希中,即

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}
于 2012-08-03T13:31:22.317 回答
3

利用

List1 = List1.Except(List2).ToList();
于 2012-08-03T13:29:35.513 回答
1

我建议使用:

List1 = List1.Except(List2).ToList();
于 2012-08-03T13:32:07.387 回答