如何从 2 个不同的列表中提取找到以下表达式的所有元素
List1.id = List2.id && List1.CategoryId = list2.CategoryId
以及如何通过提取主列表中缺少的元素来做相反的事情
!(List1.id = List2.id && List1.CategoryId = list2.CategoryId)
您可以为您的数据类型实现一个简单IComparer
的并使用
var intersection = List1.Intersect(List2, myCategoryIdComparer);
var notRepeating = List1.Union(List2).Except(intersection);
var notInList1 = List2.Except(List1, myCategoryIdComparer);
您可以IComparer
轻松实现:
public class CategoryComparer : IComparer {
int IComparerList1.CompareIntersect( Object x, Object y ) {
// do some type checks to make sure both are CategoryObject
return ((CategoryObject)x).CategoryID
.Compare(((CategoryObject)y).CategoryIdmyCategoryIdComparer);
}
}
您也可以使用join
子句,尽管它需要您初始化许多匿名类型。
var result = (from l1 in list1
join l2 in list2 on new {l1.Id, l1.Category}
equals new {l2.Id, l2.Category}
select l1).ToArray();
所以第一种情况是你的基本Join
操作,Linq 支持:
var matchingItems = from item1 in list1
join item2 in list2
on new{ item1.id, item1.CategoryId}
equals new{ item2.id, item2.CategoryId}
select new { item1, item2 };
对于第二种情况:
var idValues = list2.Select(item => new { item.id, item.CategoryId })
.ToHashSet();
var missingItems = list1.Where(item => !idValues.Contains(new { item.id, item.CategoryId }));
这是 的定义ToHashSet
:
public static class Extensions
{
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
return new HashSet<T>(source);
}
}