枚舉

2011-08-24 157 views
0

期間執行的操作我有這樣一個集合:枚舉

IEnumerable<Query> queries; 

我尋找包含在字典中的鍵的那些,我想要做一些匹配value.I知道這是可能的:

(from query in queries 
where _metadata.ContainsKey(query.Value) 
select query).ToList().ForEach(result=>_metadata[result.Value].AddQuery(result)); 

我想知道是否可以通過在匹配的查詢枚舉中調用AddQuery()來簡化它。查詢是不可變的,所以它不應該打破它。它應該是這樣的。

from query in queries 
where _metadata.ContainsKey(query.Value) 
//do something like _metadata[query.Value].AddQuery(query) 

回答

3

爲什麼不只是做:

foreach (var query = queries.Where(q => _metadata.ContainsKey(query.Value))) 
{ 
    _metadata[query.Value].AddQuery(query) 
} 

可以提供lambda表達式來選擇在哪裏等,這有副作用 - 但它通常是一個壞主意;理想情況下,LINQ查詢意味着無狀態 - 您應該可以多次遍歷查詢而不會出現問題。在這裏,我們已經明確區分了查詢中的副作用(將查詢添加到_metadata)。其餘Where謂詞執行的每一個新的查詢將被添加-

注意上面的代碼仍然有所不同,雖然工作方式略有你原來,由於道路Where執行。換句話說,儘管您的查詢本身沒有副作用,但您所介紹的副作用會影響查詢。

+0

的AddQuery()方法無關字典鍵。它只是將查詢添加到查詢集合(字典值)。它仍然是一個副作用? –

+0

@Ufuk:如果調用'AddQuery'不會影響'ContainsKey',那很好。這仍然是一個副作用,但這就是你想要的*。重要的是它是一個不會干擾查詢的副作用。 –

0

您可以使用這樣的事情,

queries.ForEach(query=> { 
    if(_metadata.ContainsKey(query.Value)) 
      //do somethign ... 
}); 

希望這有助於。

編輯

如果這不是列表,考慮@喬恩的解決方案=>只是foreach

+0

你已經混淆了你的變量名。 – Alxandr

+0

@Alxandr:謝謝!已更正 – Tigran

+0

查詢不是一個列表。我無法調用ForEach。我應該先獲得包含的值。 –