枚举

2011-08-24 120 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。我应该先获得包含的值。 –