Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何返回原始列表的副本<;T>;来自Func<;T、 TResult>;?_C#_Linq_Delegates_.net 3.5_C# 3.0 - Fatal编程技术网

C# 如何返回原始列表的副本<;T>;来自Func<;T、 TResult>;?

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

我发现(以一种艰难的方式)正在枚举的集合不能在“Foreach”语句中修改

“集合已修改;枚举操作可能无法执行。”

现在,我提出的解决方案是创建一个相同大小的虚拟集合,其中包含一个字典键,并在其上枚举以修改所讨论的集合

    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())
    ...