ElementAt
полезно, если вам нужно предоставить семантику индексирования и не можете гарантировать, что семантика индексирования будет доступна в базовом перечислении. Он использует индексирование O (1), когда перечисление действует как IList<T>
(который включает в себя список и массивы), но в противном случае это O (n) *, что позволяет использовать его в последовательности по всему, что идет от O ( n) операция будет со списком O (n * n).
Если, однако, вы получили копию ключей с dict.Keys.ToList()
, вы могли бы безопасно foreach
через это, поскольку она не будет изменена при изменении вашего словаря.
Что непонятно, так это то, почему вы не просто заменяете старый словарь новым, что снова будет значительно быстрее (простое назначение ссылок).
* Обновление: в версии linq .NET Core существует больший диапазон случаев, когда ElementAt()
- это O (1), например, результаты Select()
, выполненные на IList<T>
. Также OrderBy(…).ElementAt(…)
теперь является O (n), а не O (n log n), поскольку объединенная последовательность превращается в быстрый выбор, а не в быструю сортировку с последующей итерацией.