以下の式が見つかったすべての要素を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 };
2 番目のケースの場合:
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);
}
}