枚举
问题描述:
期间执行的操作我有这样一个集合:枚举
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)
答
为什么不只是做:
foreach (var query = queries.Where(q => _metadata.ContainsKey(query.Value)))
{
_metadata[query.Value].AddQuery(query)
}
您可以提供lambda表达式来选择在哪里等,这有副作用 - 但它通常是一个坏主意;理想情况下,LINQ查询意味着无状态 - 您应该可以多次遍历查询而不会出现问题。在这里,我们已经明确区分了查询中的副作用(将查询添加到_metadata
)。其余Where
谓词执行的每一个新的查询将被添加-
注意上面的代码仍然有所不同,虽然工作方式略有你原来,由于道路Where
执行。换句话说,尽管您的查询本身没有副作用,但您所介绍的副作用会影响查询。
的AddQuery()方法无关字典键。它只是将查询添加到查询集合(字典值)。它仍然是一个副作用? –
@Ufuk:如果调用'AddQuery'不会影响'ContainsKey',那很好。这仍然是一个副作用,但这就是你想要的*。重要的是它是一个不会干扰查询的副作用。 –