合并两个 List<T> 并使用 EF 过滤掉重复项

Union two List<T> and filter out duplicates using EF

我有两个 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 
}

您可以尝试这样的操作:

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 的结果分组,我们只选择每组的第一项。

我会使用 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();
}

也许更简单的纯 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();
    }