gpt4 book ai didi

c# - LINQ Where 语句的条件会在循环期间重新评估吗?

转载 作者:行者123 更新时间:2023-11-30 15:06:30 24 4
gpt4 key购买 nike

我有这个 foreach 循环:

foreach (var classId in m_ClassMappings[taAddressDefinition.Key])
{
if(!m_TAAddressDefinitions.ContainsKey(classId))
{
m_TAAddressDefinitions.Add(classId, taAddressDefinition.Value);
}
}

m_TAAddressDefinitions 是一个 IDictionary,其中 classId 用作唯一键值。
Resharper 建议将 if 语句更改为 LINQ 过滤器,如下所示:

foreach (var classId in m_ClassMappings[taAddressDefinition.Key].Where(
classId => !m_TAAddressDefinitions.ContainsKey(classId)))
{
m_TAAddressDefinitions.Add(classId, taAddressDefinition.Value);
}

如果这可能无法按预期工作,我很担心,因为 m_TAAddressDefinitions 集合的内容在循环内发生变化,这会导致 LINQ 过滤条件的来源(classId = > !m_TAAddressDefinitions.ContainsKey(classId)) 在途中改变。

如果在循环中添加两个具有相同值的 classId 是否会失败,或者在将值添加到集合时是否会重新计算 LINQ 条件?如果键已经存在,我最初的 if 语句是为了不引起异常。

最佳答案

在这种情况下,重构版本中 Where 返回的 IEnumerable 将在迭代时延迟生成值,这一事实实现了您想要的效果。在这种情况下,包含 ToList 调用的建议不是您想要的,因为这会将 IEnumerable 实现为一个集合,您将很容易受到攻击m_ClassMappings 集合中存在重复的 classIds

要记住的是 Where 调用中的谓词,即 classId => !m_TAAddressDefinitions.ContainsKey(classId) 将按原样对每个项目进行评估作为遍历 IEnumerable 的结果生成。因此,在 Resharper 建议的版本中,如果 m_ClassMappings 中存在重复值,第一个遇到的值将被添加到 m_TAAddressDefinitions 中,但是当到达下一个重复值时 Where 谓词将返回 false,因为该值之前已添加到字典中。

关于c# - LINQ Where 语句的条件会在循环期间重新评估吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com