我有一个字典,需要用传入数据进行更新,在解析传入数据之后,我必须检查字典中是否有任何条目不存在于传入数据中(解析后的传入数据是一个列表,我需要以将其与字典条目进行映射)。
为避免多个循环删除条目,我为字典计数运行了递减的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/