【问题标题】:Most Efficient Way of Removing Equal Values from One List to Another [closed]将相等值从一个列表删除到另一个列表的最有效方法[关闭]
【发布时间】:2016-03-30 12:34:31
【问题描述】:

我正在尝试将一个列表的每个值与另一个列表的每个值进行比较,然后删除任何匹配的值,并且当前拥有此代码。

foreach (item s in List1)
        {
            for (int i = 0; i < list2.count; i++)
            {
                if (list2.ElementAt(i)==s)
                {
                    list2.Remove(list2.ElementAt(i));
                    continue;
                }                   
            }
        }

必须有一种更快或至少一种强度较低的方法来执行这样的比较。需要一种更快的方法,因为这可用于比较每个超过 1000 个值的列表。任何帮助将不胜感激

【问题讨论】:

  • 其实要求是把list2中存在list1中的元素去掉吧?
  • 正如@un-lucky 指出的那样,有更好的方法来做你可能需要的事情......让你的代码更快(不是更好,因为.NET 中的现有方法这样做) - 使用字典来加快搜索速度。可能与stackoverflow.com/questions/5636438/… 重复。您可能想阅读Set operations 来改进问题。
  • 您的问题和您的代码不匹配。您的问题是关于比较两个列表中的所有元素对。您的代码是关于从另一个列表中删除一个列表的所有元素。这些是完全不同的问题,而您将它们完全混为一谈。两者都有有效的解决方案,但它们是不同的解决方案,所以说出你真正想要的

标签: c# asp.net list optimization


【解决方案1】:

使用Except,它使用默认相等比较器产生两个序列的差异。

扩展方法使用 HashSet&lt;T&gt; 除外,它在 LookUp 中产生 O(1) 访问。

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

【讨论】:

    【解决方案2】:

    您想从list2 中删除包含在list1 中的所有元素。一种有效的方法是创建一个HashSet,它将包含对list1 中每个对象的引用,因为针对HashSet 的查找非常快。然后遍历list2 中的每个元素,但顺序相反。这很重要,因为您将删除元素。试试这样的:

    List<MyObjType> list1 = new List<MyObjType>();
    List<MyObjType> list2 = new List<MyObjType>();
    
    HashSet<MyObjType> list1Hashset = new HashSet<MyObjType>(list1);
    for (int i = list2.Count - 1; i >= 0; i--)
    {
        if (list1Hashset.Contains(list2[i]))
            list2.RemoveAt(i);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 2019-11-09
      • 2011-11-28
      • 2012-02-29
      • 1970-01-01
      • 2016-08-28
      • 2016-09-19
      • 2011-01-31
      相关资源
      最近更新 更多