在枚举期间执行操作
本文关键字:执行 操作 枚举 | 更新日期: 2023-09-27 18:06:35
我有一个这样的集合:
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)
为什么不直接做:
foreach (var query = queries.Where(q => _metadata.ContainsKey(query.Value)))
{
_metadata[query.Value].AddQuery(query)
}
你可以提供lambdas来Select, Where等有副作用-但这通常是一个坏主意;理想情况下,LINQ查询应该是无状态的——您应该能够对查询进行多次迭代而不会出现任何问题。在这里,我们已经清楚地将副作用(向_metadata
添加查询)从查询中分离出来。
Where
的执行方式不同,上面的代码仍然与原始代码略有不同——在执行剩余的Where
谓词之前,每个新查询将添加。换句话说,尽管您的查询本身没有副作用,但是您引入的副作用会对查询产生影响。
你可以这样写,伪代码:
queries.ForEach(query=> {
if(_metadata.ContainsKey(query.Value))
//do somethign ...
});
希望对你有帮助。
编辑
如果这不是列表,考虑@Jon的解决方案=>只是foreach
循环