2009-05-18 63 views
4

有什麼方法可以選擇列表中未包含在其他列表中的項目嗎?例如:Linq - 排除不同列表類型的項目

list1 = From t In list1 Where Not list2.Contains(t.column1) 

這給我的錯誤:

Value of type 'Integer' cannot be converted to '<anonymous type>' 

這是有道理的,因爲list2.Contains期待同類型列表2。但是,列表類型是不同的。我只想根據列比較進行選擇。

回答

6

您是否嘗試過這樣的事情?

list1 = From t In list1 Where Not list2.Any(l => t.column1 = l.column1 AndAlso t.column2 = l.column2) 

我不確定它的效率如何,但我認爲它應該適合您。

6

看看。 Except()擴展方法,與投影結合:

list1 = list1.Except(list2.Select(Function(l) l.ID)) 
+0

除了仍然期望用於比較的相同類型的列表。 – Daniel 2009-05-18 13:31:59

+1

然後使用投影來映射它:list1.Except(list2.Select(...)) – 2009-05-18 13:34:44

+0

有沒有辦法做到這一點與多列? – Daniel 2009-05-18 13:59:15

7

那麼是什麼list2實際上包含哪些內容?如果你能準確地表達你的查詢,我們可以在LINQ中表達它。不知道list1list2column1是否很難提供幫助。

什麼我說是List<T>.Contains將爲您檢查的每個項目的O(n)。如果list2可能非小,您可能需要創建一個HashSet<T> - 然後每個Contains調用將會快得多。

但是,當我們更瞭解情況時,我們可能會提出一個完全不同的解決方案。請儘可能具體地提出問題以獲得最佳答案。

編輯:如果tvanfosson的解決方案爲您工作如果您使用LINQ到對象,那麼您將有一個潛在的性能坑。這將是更好(IMO)上做list2投影一次,並建立了一套:

Dim invalid = New HashSet(Of Integer)(list2.Select(Function(x) x.Id)) 
list1 = From t in list1 Where Not invalid.Contains(t.column1)