更新List <t>这样</t>是否安全

时间:2013-06-13 14:15:04

标签: linq list ienumerable

我有一个列表,我想查询然后更新,这是它的工作原理:

List<PingtreeNode> nodes = new List<PingtreeNode>();
... add some nodes

var activeNodes = nodes.Where(x => x.Status == PingtreeNodeStatus.Active);

foreach(var n in activeNodes)
{
  n.Status = PingtreeNodeStatus.Applied;
}

我不确定这是否完全安全,因为我正在过滤状态,然后根据原始查询更新状态。

任何建议表示赞赏

1 个答案:

答案 0 :(得分:1)

是的,这是完全安全的,因为您没有修改集合(即添加/删除项目) - 您只是修改项目。这将影响进一步的查询,但不会影响当前。

foreach语句中使用查询时,会创建枚举数。它按照底层集合(您的节点列表)的顺序逐个移动项目,并检查项目是否匹配过滤器。找到此类项目后,将其作为当前项返回。您已经检索了此项目,因此您可以自由地对其进行任何修改。在下一次迭代时,枚举器继续从它停止的点开始枚举源项。