首先,你只關心數組listB的ItemIds,所以:
var bIDs = ListB.Select(x => x.ItemId);
要回答你的問題的第一部分,我會通過找到兩個列表(它們共享的所有項目的集合)的交集來解決這個問題。如果它至少有一個元素,那麼兩者之間會有重疊。
var sharedIds = ListA.Intersect(bIDs);
if (sharedIds.Any())
// list A contains at least one ItemID which ListB contains
至於第二部分,你想看看列表A是列表B.搜索這個子集,堆棧溢出提出了clean solution:
if (!ListA.Except(bIDs).Any())
// yes, list A is a subset of list B
這段代碼工作,因爲ListA.Except(bIDs)
認定ListA
有bIDs
沒有的元素。如果這是空的,則ListA
不包含bIDs
不包含的任何內容。因此,ListA
中的所有內容也都在bIDs
之內。
下面是一個例子:A = {1, 2}
; B = {1, 2, 3}
。 A是B的一個子集。A.Except(B)
爲您提供了一個空集--B具有1和2,因此不能出現在結果列表中,並且B中沒有任何內容。因此,當A是B的子集時, A.Except(B).Any()
給出錯誤,因爲結果中沒有元素;所以如果我們想要處理這種情況,我們顯然會否定它。爲了完整起見,如果我們交換A和B使得A不是B的子集:A = {1, 2, 3}
; B = {1, 2}
,然後A.Except(B)
給出{3}
。它不能包含1或2,因爲B包含1和2.但B不包含3,所以A.Except(B)
可以包含。由於{3}
包含一個元素,因此它不是空的,所以A.Except(B).Any()
爲真。否定的,如果A不是B的子集,那麼這是錯誤的。
我的解釋有點簡潔;如果你想進一步觀察事物(我建議你這樣做 - 一個小集合理論可以走很長的路),A.Except(B)
是LINQ的名稱,用於設置差異或相對集合補碼。如果你有這種傾向,Wikibooks有一個體面的introduction來設定理論。
我有點困惑的部分2.你是否想知道,如果在利斯塔的所有項目都包含在B的項目Id的或者是否需要包含在B的ItemId中的ListA值列表。稍有不同的查詢。你最後一句話是什麼讓我困惑。 – 2011-04-13 22:54:22
我希望ListA中的每個long至少等於ListB中的一個MyObject.ItemId。 – Scott 2011-04-13 23:59:16