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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ToList
  • ToArray
  • ToDictionary