我有来自两个不同数据源的两个List<T>
对象具有相同的T
对象,并希望将两个List<T>
对象合并为一个List<T>
对象并过滤掉重复。
public class MyClass
{
public int ID { get; set; }
public string Name { get; set; }
}
public List<MyClass> MyMethod(List<MyClass> ListA, List<MyClass> ListB)
{
//would like to union ListA and ListB and filter out any duplicates by ID from ListB that are in ListA
}
答案 0 :(得分:3)
我会使用Jon skeet的this answer删除重复项。
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
然后
public List<MyClass> MyMethod(List<MyClass> ListA, List<MyClass> ListB)
{
return ListA.Union(ListB).DistinctBy(x => x.ID).ToList();
}
答案 1 :(得分:3)
也许更简单的纯LINQ解决方案:
我使用concat,因为无论如何GroupBy将删除所有重复
public List<MyClass> MyMethod(IEnumerable<MyClass> A, IEnumerable<MyClass> B)
{
return A.Concat(B).GroupBy(x => x.ID).Select(x => x.First()).ToList();
}
答案 2 :(得分:2)
您可以尝试这样的事情:
public List<MyClass> MyMethod(List<MyClass> ListA, List<MyClass> ListB)
{
return (ListA.Union(ListB)).GroupBy(x=>x.ID)
.Select(gr=>new MyClass {
ID=gr.Key,
Name=gr.Select(x=>x.Name).First()})
.ToLIst();
}
最初我们采用两个列表的联合。然后我们按ID
的结果进行分组,我们只选择每组的第一项。