簡體   English   中英

基於列的兩個列表的並集

[英]Taking union of two lists based on column

我正在使用 Linq to Sql 合並兩個列表。 使用 List1 和 List2:

 var tr = List1.Union(List2).ToList();

Union 工作正常,但問題是它正在檢查每一列並刪除我想要的一些行。 所以我想知道是否有一種方法可以僅基於每個列表的一列執行聯合,比如id

就像是:

var t = List1.id.Union(List2.id).ToList();

這不起作用,但我想知道是否有辦法做到這一點,無論是使用 LINQ 還是 T-SQL

您應該使用此Union () 重載(使用自定義相等比較器),或類似以下內容:

list1.Concat(list2).GroupBy(x => x.DateProperty).Select(m => m.First());

第一種解決方案當然更有效。

當然,你需要一個自定義的IEqualityComparerUnion 我有一個非常動態的,傳入的大塊代碼:

public class PropertyEqualityComparer<TObject, TProperty> 
    : IEqualityComparer<TObject>
{
    Func<TObject, TProperty> _selector;
    IEqualityComparer<TProperty> _internalComparer;
    public PropertyEqualityComparer(Func<TObject, TProperty> propertySelector,
        IEqualityComparer<TProperty> innerEqualityComparer = null)
    {
        _selector = propertySelector;
        _internalComparer = innerEqualityComparer;
    }
    public int GetHashCode(TObject obj)
    {
        return _selector(obj).GetHashCode();
    }
    public bool Equals(TObject x, TObject y)
    {
        IEqualityComparer<TProperty> comparer = 
            _internalComparer ?? EqualityComparer<TProperty>.Default;
        return comparer.Equals(_selector(x), _selector(y));
    }
}
public static class PropertyEqualityComparer
{
    public static PropertyEqualityComparer<TObject, TProperty>
        GetNew<TObject, TProperty>(Func<TObject, TProperty> propertySelector)
    { 
        return new PropertyEqualityComparer<TObject, TProperty>
            (propertySelector);
    }
    public static PropertyEqualityComparer<TObject, TProperty>
        GetNew<TObject, TProperty>
        (Func<TObject, TProperty> propertySelector, 
        IEqualityComparer<TProperty> comparer)
    { 
        return new PropertyEqualityComparer<TObject, TProperty>
            (propertySelector, comparer);
    }
}

現在,您需要做的就是使用該相等比較器調用 Union(使用適合您情況的 lambda 實例化):

var tr = List1.Union(List2, PropertyEqualityComparer.GetNew(n => n.Id)).ToList();

試試這個

var List3 = List1.Join(
List2, 
l1 => l1.Id,
l2 => l2.Id,
(l1, l2) => new Model
{
   Id = l1.Id,
   Val1 = l1.Val1 or other,
   Val2 = l2.Val2  or other
});

有關更多詳細信息,您可以展示您的模型

嘗試這個:

var merged = new List<Person>(list1);
merged.AddRange(list2.Where(p2 => 
                list1.All(p1 => p1.Id != p2.Id)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM