C# 在枚举期间执行操作

C# 在枚举期间执行操作,c#,.net,linq,C#,.net,Linq,我有这样的收藏: IEnumerable<Query> queries; 我想知道是否可以通过在匹配的查询枚举中调用AddQuery()来简化它。查询是不可变的,所以它不应该破坏它 from query in queries where _metadata.ContainsKey(query.Value) //do something like _metadata[query.Value].AddQuery(query) 为什么不干脆做: foreach (var query =

我有这样的收藏:

IEnumerable<Query> queries;
我想知道是否可以通过在匹配的查询枚举中调用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来选择,在哪里等有副作用-但这通常是一个坏主意;LINQ查询在理想情况下应该是无状态的——您应该能够多次迭代查询,而不会出现任何问题。在这里,我们已经将副作用(向
\u元数据添加查询
)与查询明确分开

请注意,由于执行
Where
的方式不同,上述代码的工作方式仍然与原始代码略有不同-每个新查询将添加到执行剩余
Where
谓词之前。换句话说,尽管您的查询本身没有副作用,但您引入的副作用会对查询产生影响。

为什么不这样做呢:

foreach (var query = queries.Where(q => _metadata.ContainsKey(query.Value)))
{
    _metadata[query.Value].AddQuery(query)
}
您可以提供lambdas来选择,在哪里等有副作用-但这通常是一个坏主意;LINQ查询在理想情况下应该是无状态的——您应该能够多次迭代查询,而不会出现任何问题。在这里,我们已经将副作用(向
\u元数据添加查询
)与查询明确分开


请注意,由于执行
Where
的方式不同,上述代码的工作方式仍然与原始代码略有不同-每个新查询将添加到执行剩余
Where
谓词之前。换句话说,尽管您的查询本身没有副作用,但您引入的副作用会对查询产生影响。

您可以使用类似以下内容的伪代码:

希望这有帮助

编辑


如果这不是列表,请考虑@乔恩的解决方案= >代码>前缀循环

< p>可以使用类似的东西,伪代码:

希望这有帮助

编辑


如果这不是列表,请考虑@乔恩的解决方案= >只是代码>前缀循环

你把变量名混在一起。查询不是列表。我不能调用FURACH。我应该先得到包含的值。@Ufuk因为foreach循环中有Jon的非常好的解决方案,所以我编辑了我的答案。你把变量名弄混了。查询不是列表。我不能调用foreach。我应该先得到包含的值。@Ufuk因为foreach循环中有Jon的非常好的解决方案,所以我编辑我的答案。AddQuery()方法与字典键无关。它只是将查询添加到查询集合(字典值)。这还会有副作用吗?@Ufuk:如果调用
AddQuery
不会影响
ContainsKey
,那就好了。这仍然是副作用,但这正是你想要的。重要的是,这是一个不会干扰查询的副作用。AddQuery()方法与字典键无关。它只是将查询添加到查询集合(字典值)。这还会有副作用吗?@Ufuk:如果调用
AddQuery
不会影响
ContainsKey
,那就好了。这仍然是副作用,但这正是你想要的。重要的是,这是一个不会干扰查询的副作用。
queries.ForEach(query=> {
    if(_metadata.ContainsKey(query.Value))
           //do somethign ... 
});