C# 如何返回原始列表的副本<;T>;来自Func<;T、 TResult>;?
我发现(以一种艰难的方式)正在枚举的集合不能在“Foreach”语句中修改 “集合已修改;枚举操作可能无法执行。” 现在,我提出的解决方案是创建一个相同大小的虚拟集合,其中包含一个字典键,并在其上枚举以修改所讨论的集合C# 如何返回原始列表的副本<;T>;来自Func<;T、 TResult>;?,c#,linq,delegates,.net-3.5,c#-3.0,C#,Linq,Delegates,.net 3.5,C# 3.0,我发现(以一种艰难的方式)正在枚举的集合不能在“Foreach”语句中修改 “集合已修改;枚举操作可能无法执行。” 现在,我提出的解决方案是创建一个相同大小的虚拟集合,其中包含一个字典键,并在其上枚举以修改所讨论的集合 private void InvalidateAuthenticatedNodes() { var dummy = new Dictionary<int, bool>(_AuthenticatedNodes.Count);
private void InvalidateAuthenticatedNodes()
{
var dummy = new Dictionary<int, bool>(_AuthenticatedNodes.Count);
foreach (var nodeId in _AuthenticatedNodes.Keys)
dummy[nodeId] = false;
foreach (var nodeId in dummy.Keys)
_AuthenticatedNodes[nodeId] = false;
ClearAuthenticatedDateTime();
}
只需在集合的末尾添加一个.ToList(),它就会自动返回列表的完整副本
foreach (var nodeId in _AuthenticatedNodes.Keys.ToList())
...
只需在集合的末尾添加一个.ToList(),它就会自动返回列表的完整副本
foreach (var nodeId in _AuthenticatedNodes.Keys.ToList())
...
不使用foreach,您可以使用normal for。但是,在添加/删除项时要小心,它会更改集合中元素的索引。可以使用普通的for,而不是使用foreach。但是,在添加/删除项时要小心,它会更改集合中元素的索引。一旦更改可枚举类,原始枚举数可能会无效,因此需要创建副本并在其中进行修改。一旦更改可枚举类,您的原始枚举数可能无效,因此需要创建一个副本并在那里进行修改。谢谢;这就是我选择的道路;这就是我选择的路径。由于您没有真正使用列表(例如,没有添加或删除条目),请改用ToArray()。ToList()大致可以转换为ToArray(),但要贵得多。谢谢你的输入,chuckj。我想我需要在重构时停下来。但是当我遇到类似的情况时,我会听从你的建议。因为你不是真的在使用列表(例如不添加或删除条目),所以请使用ToArray()。ToList()大致可以转换为ToArray(),但要贵得多。谢谢你的输入,chuckj。我想我需要在重构时停下来。但当我遇到类似情况时,我会听从你的建议。
_AuthenticatedNodes.Keys.ToList().ForEach(
nodeId => _AuthenticatedNodes[nodeId] = false);
foreach (var nodeId in _AuthenticatedNodes.Keys.ToList())
...