2012-07-23 98 views
1

我有兩種不同類型的對象,它們具有可能匹配ID的ID字段。 FindAll操作返回正確的非匹配對象,而Where操作返回所有對象。有人能幫我理解爲什麼嗎?Linq FindAll和Where返回不同​​的結果

var _kenticoIDs = new HashSet<string>(_kenticoSessions.Select(p => p.AttendeeInteractiveSessionID)); 
var list = _aiSessionIDList.FindAll(p => !_kenticoIDs.Contains(p.SessionID)); 
var ienum = _aiSessionIDList.Where(p => !_kenticoIDs.Contains(p.SessionID)); 

編輯:如果我對resultA變量執行.ToList(),那麼結果列表與結果變量相同。但是,當我在.ToList()之前檢查兩個變量(result/resultA)時,有一個值爲6,一個值爲63。我覺得我失去了一些明顯的東西。

+3

您的代碼目前*可怕*格式,以至不可讀。請修復它。 – 2012-07-23 19:33:13

+0

你是說'_aiSessionIDList.Where(p =>!_kenticoIDs.Contains(p.SessionID))'返回'_aiSessionIDList'中的每一項,即使列表中的某個項目的ID不在'_kenticoIDs'哈希中? – 2012-07-23 19:36:26

回答

5

WhereFindAll是等價的,除了在執行方面,Where被推遲,但FindAll立即。

來源:This SO線程。

+0

我之前曾經看過那個確切的問題,並且看到延遲執行,但錯誤地認爲在調試器中檢查它與按需操作相同。 – Jay 2012-07-23 19:49:22

+0

噢,好的。下一次,在處理LINQ變量時,應注意「延遲」執行上下文。一個好的方法是調用'Count()'方法來強制在'Watch'窗口中立即進行評估。 – Channs 2012-07-23 19:54:28

+0

是的,我有點像白癡。直到我做了ToList()之後我才意識到我只是沒有做任何事情來實際評估結果集。 – Jay 2012-07-23 19:58:01

2

我認爲你遇到的問題是理解Linq。 Where is a Linq extension method而FindAll是一個List方法。 Linq表達式在枚舉結束之前不進行評估,或者轉換爲列表/數組。