[英]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());
第一種解決方案當然更有效。
當然,你需要一個自定義的IEqualityComparer
和Union
。 我有一個非常動態的,傳入的大塊代碼:
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.