gpt4 book ai didi

c# - Enumerable.ElementAt 与 foreach

转载 作者:太空宇宙 更新时间:2023-11-03 17:16:00 26 4
gpt4 key购买 nike

我有一个字典,我需要用传入数据保持更新,在解析传入数据后,我必须检查字典中是否有任何条目不存在于传入数据中(解析时的传入数据是一个列表我需要将其与字典条目进行映射)。

为了避免多次循环删除条目,我为字典计数运行了递减循环,然后使用 ElementAt 获取索引的字典键,然后检查输入数据中是否存在该条目,如果不存在,则删除列表中的那个条目。我这样做是因为在字典键上运行 foreach 循环并从中删除会引发异常,因为字典键集合将被修改。

我想了解这样做会对执行时间产生任何影响。我想了解 ElementAt 操作的顺序是什么。

最佳答案

ElementAt如果您需要提供索引语义并且不能保证索引语义在底层枚举中可用,则此方法很有用。当操作的枚举是 IList<T> 时,它确实使用 O(1) 索引(其中包括列表和数组),但除此之外是 O(n)*,这使得它在从 O(n) 操作到 O(n * n) 的所有操作的序列中使用。

但是,如果您使用 dict.Keys.ToList() 获得了 key 的副本那么你可以安全地 foreach通过它,因为它不会因您字典的更改而改变。

不清楚的是为什么您不直接用新字典替换旧字典,这样会再次快得多(简单的引用分配)。

*更新:在 .NET Core 版本的 linq 中,有更多情况 ElementAt()是 O(1) 例如 Select() 的结果在 IList<T> 上完成.还有 OrderBy(…).ElementAt(…)现在是 O(n) 而不是 O(n log n),因为组合序列变成了快速选择而不是快速排序,然后进行迭代。

关于c# - Enumerable.ElementAt 与 foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871807/

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