Union two List <t>并使用EF过滤掉重复项

时间:2015-10-21 22:46:21

标签: c# entity-framework union

我有来自两个不同数据源的两个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 
}

3 个答案:

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