快速加入2个列表,没有重复

时间:2013-01-28 12:52:37

标签: vb.net linq

我基本上有2个相同对象类型的列表。 第一个(A,B,C,D)是我的一个对象的属性。

我需要在我的对象中加入第二个列表(B,E,F),但不包括重复项。

这意味着我不能这样做:

    ListA.AddRange(ListB)

我必须将其更改为

    ForEach item in ListB
       If Not ListA.Contains(item)
          ListA.Add(item)
       EndIf
    Next

或添加:

    ListA = ListA.Distinct()

是否有更快,更顺畅的方式来编码?

2 个答案:

答案 0 :(得分:2)

如果您已覆盖EqualsGetHashcode,则可以直接使用Enumerable.Union

var ListC = ListA.Union(ListB).ToList();

否则,您可以实施IEqulityCompararer<Foo>并使用ListA.Union(ListB, comparer)

假设Foo是您班级的类型,Name是您要用来检测重复项的属性。

public class FooComparer : IEqualityComparer<Foo>
{
    public bool Equals(Foo x, Foo y)
    {
        if (x == null || y == null) return false;
        // 'A' = 'a' just to demonstrate case-insensitive duplicates
        return x.Name.Equals(y.Name, StringComparison.OrdinalIgnoreCase);
    }

    public int GetHashCode(Foo obj)
    {
        if (obj == null) return int.MinValue;
        return obj.Name.GetHashCode();
    }
}

现在将此比较器用于Union

var ListC = ListA.Union(ListB, new FooComparer()).ToList();

答案 1 :(得分:0)

没有更快的方法可以做到这一点,因为无论你做什么,你都需要检查两个列表中的每个元素以查看它是否重复,然后你可以使用自己的代码或使用Linq。

无论如何,你将拥有list1.Count * list2.Count操作