基于列取两个列表的并集
本文关键字:列表 两个 于列取 | 更新日期: 2023-09-27 18:17:52
我正在使用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());
当然,您需要一个带有Union
的自定义IEqualityComparer
。我有一个非常动态的,很大的代码块传入:
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();
try something this
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)));