从一个列表到另一个列表中删除相等值的最有效方法

时间:2016-03-30 02:14:46

标签: c# asp.net list optimization

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

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个值的列表。任何帮助都会有很大帮助

2 个答案:

答案 0 :(得分:1)

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

除了扩展方法使用HashSet<T>,它在LookUp中产生O(1)访问权。

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

答案 1 :(得分:0)

您要删除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);
}