我基本上有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()
是否有更快,更顺畅的方式来编码?
答案 0 :(得分: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();
答案 1 :(得分:0)
没有更快的方法可以做到这一点,因为无论你做什么,你都需要检查两个列表中的每个元素以查看它是否重复,然后你可以使用自己的代码或使用Linq。
无论如何,你将拥有list1.Count * list2.Count操作