Производительность Linq ToList/ToArray/ToDictionary

Ну, я встречаю много ситуаций, когда недостаточно IEnumerable. Однако я не уверен в производительности вышеупомянутых вызовов методов.

Я действительно хочу спросить:

Является ли производительность ToList/ToArray:

  • операция O (n), которая копирует IEnumerable в новый массив /List?
  • Если я вызвал метод расширения linq в списке, он имеет производительность O (1), если я вызываю ToList, но O (n), если вызывается ToArray (и наоборот, если мой исходный список был массивом)?

  • Происходит какая-то магия, а производительность - O (1)?

Вероятно, для словаря есть O (n), правильно?

Ответ 1

Является ли производительность ToList/ToArray операцией O (n), которая копирует IEnumerable в новый массив /List?

Да. ToList немного более эффективен, так как ему не нужно сначала обрезать внутренний буфер до нужной длины.

Если я вызвал метод расширения linq в списке, он имеет производительность O (1), если я вызываю ToList, но O (n), если вызывается ToArray (и наоборот, если мой исходный список был массивом)?

Нет. Для обоих вызовов всегда создается новая коллекция; что мелкая копия оригинальной коллекции. Более эффективно вызывать ToList или ToArray на любом ICollection<T>, чем на простой IEnumerable<T>, который не реализует ICollection<T>, хотя, как и в случае с коллекцией, с начала известно, что длина начинается. (Это обнаружено во время выполнения, хотя вам не нужно беспокоиться о типе времени компиляции.)

Вероятно, для словаря есть O (n), правильно?

Предполагая, что хэш чувствителен, это O (N), да. В основном он создает новый словарь точно так, как вы, вероятно, ожидаете.

Возможно, вы захотите прочитать соответствующие записи в моей блоге блога Edulinq: