1

我基本上有 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()

有没有更快更流畅的编码方式?

4

2 回答 2

2

如果您已经覆盖了Equals并且GetHashcode可以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();
于 2013-01-28T12:58:19.463 回答
0

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

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

于 2013-01-28T12:57:42.703 回答