我有一个这样的集合:
IEnumerable<Query> queries;
我正在搜索字典键中包含的字符,我想对匹配值做一些事情。我知道这是可能的:
(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)
答案 0 :(得分:3)
为什么不这样做:
foreach (var query = queries.Where(q => _metadata.ContainsKey(query.Value)))
{
_metadata[query.Value].AddQuery(query)
}
你可以为选择,等等提供有副作用的lambdas - 但这通常是一个坏主意; LINQ查询意味着无状态,理想情况下 - 您应该能够多次迭代查询而没有任何问题。在这里,我们清楚地将查询中的副作用(向_metadata
添加查询)分开了。
请注意,上面的代码仍然与原始代码略有不同,因为执行Where
的方式 - 在执行剩余的Where
谓词之前,每个新查询都会添加 < / em>的。换句话说,虽然您的查询本身是无副作用的,但您引入的副作用会对查询产生影响。
答案 1 :(得分:0)
你可以使用这样的东西,伪代码:
queries.ForEach(query=> {
if(_metadata.ContainsKey(query.Value))
//do somethign ...
});
希望这有帮助。
修改强>
如果这不是列表,请考虑@ Jon的解决方案=&gt;只是foreach
循环