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

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

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

最佳答案

如果需要提供索引语义并且不能保证索引语义可在基础枚举中使用,则ElementAt很有用。当枚举是IList<T>(包括List和数组)时,它的确使用O(1)索引,否则使用O(n)*,这使得从O( n)操作,它将带有O(n * n)的列表。

但是,如果您获得了带有dict.Keys.ToList()的键的副本,则可以安全地通过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/

10-11 03:40