在枚举期间执行操作

本文关键字:执行 操作 枚举 | 更新日期: 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循环