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

17

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

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

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

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

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

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

    
задан Jonny 23.02.2013 в 16:11
источник

1 ответ

41
  

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

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

  

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

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

  

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

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

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

ответ дан Jon Skeet 23.02.2013 в 16:19
источник