【问题标题】:Removal operation in List<string>List<string> 中的删除操作
【发布时间】:2012-08-01 13:27:19
【问题描述】:

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

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

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

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

编辑

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

Add operation in List<string>

TIA!

【问题讨论】:

    标签: c# string


    【解决方案1】:

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

    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}
    

    【讨论】:

      【解决方案2】:

      你可以使用:

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

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

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

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

      【讨论】:

        【解决方案3】:

        使用

        List1 = List1.Except(List2).ToList();
        

        【讨论】:

        • 那不会编译 - 删除单个项目。
        • 它仍然无法编译,因为Except 返回一个IEnumerable&lt;T&gt;
        • 现在是重新分配 List1,而不是改变原来的List1
        • @NikhilAgrawal:此时你的答案与我的后半部分相同,但没有额外的信息:)
        【解决方案4】:

        我推荐使用:

        List1 = List1.Except(List2).ToList();
        

        【讨论】:

          猜你喜欢
          • 2012-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-06
          • 2017-02-15
          • 2014-07-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多