gpt4 book ai didi

c# - 从 foreach 中的 Dictionary 中删除一个键会导致问题吗?或者我应该更好地构建一个新的词典?

转载 作者:可可西里 更新时间:2023-11-01 03:05:32 25 4
gpt4 key购买 nike

例如:

1.

         foreach (var item in myDic)
{
if (item.value == 42)
myDic.remove(item.key);
}

无论内部括号中的语句如何影响 myDic,迭代器是否会正常工作?

2.

    var newDic = myDic.where(x=>x.value!=42).ToDictionary(x=>x.key,x=>x.value);

第二种方法是好的做法吗?函数式编程和不可变?

最佳答案

第一种方法会在运行时崩溃,因为枚举器确保在枚举时没有人从基础集合中删除。

第二种方法是一个不错的想法,但是 C# 字典是可变的,如果您可以通过修改完成同样的事情,那么复制它们既不符合习惯也不高效。

这是一个典型的方式:

var itemsToRemove = myDic.Where(f => f.Value == 42).ToArray();
foreach (var item in itemsToRemove)
myDic.Remove(item.Key);

编辑:回应您在评论中提出的问题。这是您的 other question 中的示例作品:

myList = myList.where(x=>x>10).select(x=>x-10);

这行代码没有运行任何东西;这完全是懒惰的。为了争论起见,假设我们在它之后有一个 foreach 以使其看起来更像这个问题的示例。

foreach (int n in myList)
Console.WriteLine(n);

执行时,每次迭代都会发生以下情况:

  1. 在枚举器上调用MoveNext
  2. 枚举器找到下一个大于 10 的值
  3. 然后将该值减去 10 并将 Current 属性设置为该值
  4. Current 属性绑定(bind)到变量 n
  5. Console.WriteLine就这样

你可以看到没有神秘,没有无限循环,什么都没有。

现在与我的示例进行比较,假设我们省略了 ToArray

var itemsToRemove = myDic.Where(f => f.Value == 42);
foreach (var item in itemsToRemove)
myDic.Remove(item.Key);
  1. 在枚举器上调用MoveNext
  2. 枚举器找到值为 42 的下一对并将 Current 属性设置为该值
  3. Current 属性绑定(bind)到变量 item
  4. 删除

这是行不通的,因为当你打开一个枚举器时,从集合中 WriteLine 一些东西是完全可以的,但是你不能 Remove 一些东西从集合中打开枚举器。

如果您预先调用 ToArray,那么您首先要枚举字典并填充数组。当我们到达 foreach 时,foreach 语句在数组 上打开了一个枚举器,而不是字典。您可以在遍历数组时从字典中删除。

关于c# - 从 foreach 中的 Dictionary 中删除一个键会导致问题吗?或者我应该更好地构建一个新的词典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7176263/

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