【问题标题】:Is it safe to update a List<T> like this像这样更新 List<T> 是否安全
【发布时间】:2013-06-13 14:15:04
【问题描述】:

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

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;
}

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

任何建议表示赞赏

【问题讨论】:

  • 假设 PingtreeNode 是一个类,而不是结构。

标签: linq list ienumerable


【解决方案1】:

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

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

【讨论】:

  • 值得注意的是,如果T 是类类型,List&lt;T&gt; 不会持有 T 的实例--它识别 他们。将类类型变量视为保存对象 ID,将referenceTypeExpression.doSomething() 形式的代码视为要求系统“定位由referenceTypeExpression 识别的事物标识,并执行@987654327,这可能会有所帮助。 那个东西的@方法。请注意,referenceTypeExpression 或其任何部分都不知道或关心要求它识别对象的代码正在对该对象执行doSomething() 方法。
猜你喜欢
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
相关资源
最近更新 更多