如何從2名不同的列表中提取所有其中以下表達式被發現LINQ的用於選擇從列表1中2個特性之間的列表2存在由comparsion元件值
List1.id = List2.id && List1.CategoryId = list2.CategoryId
和元素如何做逆通過提取主列表中缺少的元素
!(List1.id = List2.id && List1.CategoryId = list2.CategoryId)
如何從2名不同的列表中提取所有其中以下表達式被發現LINQ的用於選擇從列表1中2個特性之間的列表2存在由comparsion元件值
List1.id = List2.id && List1.CategoryId = list2.CategoryId
和元素如何做逆通過提取主列表中缺少的元素
!(List1.id = List2.id && List1.CategoryId = list2.CategoryId)
因此,第一種情況是你的基本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);
}
}
您可以實現一個簡單的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();
這將無法處理第二種情況 – Servy
完全不可讀 –
這裏的問題變成了多少行你能寫出來做同樣簡單的事嗎 –
我看不出你的意思。你是說你可以用較少的代碼做同樣的事情嗎?如果是這樣,通過一切手段證明。目前,您的第一個答案是不完整的,如果您完成了第一個答案,則會比這更長,而第二個答案不起作用,因此比較它們是無效的。 – Servy
您的回答將會是我所尋找的,因爲我所提及的這些列表在這種特殊情況下並不是相同的類型,但是在您的最後一個示例中,我列出了只存在於兩個表上的項目列表。基於這個返回的列表我可以實現一個過濾器來獲取List2上缺少的項目的返回列表? – Lothre1