在枚举期间执行操作

时间:2011-08-24 10:19:56

标签: c# .net linq

我有一个这样的集合:

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)

2 个答案:

答案 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循环