您正在寻找的是Intersect 方法(有点扭曲)。你需要一个相等比较器。
相交:通过使用默认相等比较器比较值来产生两个序列的集合交集。
第一个解决方案:覆盖 Equals
Try it Online!
public class Item
{
public int Id {get;set;}
public override bool Equals(object obj)
{
var item = obj as Item;
return item == null ? false : this.Id.Equals(item.Id);
}
public override int GetHashCode() => Id.GetHashCode();
}
public static void Main()
{
var master = (new []{ 1, 2, 3, 4, 5}).Select(x => new Item {Id = x});
var update = (new []{ 1, 3, 5}).Select(x => new Item {Id = x});
// yes all you need is here
master = master.Intersect(update);
foreach (var item in master)
Console.WriteLine(item.Id);
}
输出
1
3
5
第二种解决方案:创建自定义比较器
Try it Online!
public class Item
{
public int Id { get; set; }
}
public static void Main()
{
// example
var master = (new []{ 1, 2, 3, 4, 5}).Select(x => new Item {Id = x});
var update = (new []{ 1, 3, 5}).Select(x => new Item {Id = x});
// everything happens here.
var master = master.Intersect(update, new KeyEqualityComparer<Item>(s => s.Id));
foreach (var item in master)
Console.WriteLine(item.Id);
}
// Interset doest not know how to compare by property. This will help it.
public class KeyEqualityComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, object> keyExtractor;
public KeyEqualityComparer(Func<T, object> keyExtractor) => keyExtractor = keyExtractor;
public bool Equals(T x, T y) => keyExtractor(x).Equals(this.keyExtractor(y));
public int GetHashCode(T obj) => keyExtractor(obj).GetHashCode();
}
输出
1
3
5