Мне нужно повторить и посчитать.Что является самым быстрым или предпочтительным:toArray() или ToList()?[дубликат]

StackOverflow https://stackoverflow.com/questions/1826658

Вопрос

Возможный Дубликат:
Что лучше вызывать ToList() или toArray() в запросах LINQ?

У меня есть такой код, как этот:

void Foobar(string[] arr, Dictionary<string, string[]>)
{
   var t = arr.Intersect(dic.Keys).ToList(); // .or ToArray() ?
   foreach(var item in t)
   {
      ..
   }

   var j = t.Count; // also I need this
}

какой метод предпочтительнее?

Я мог бы обойтись без них, но мне нужно знать размер, и я не хочу звонить Enumerable.Count<T>() - тогда, кажется, нужно делать больше действий Array<T>.Size или List<T>.Count.Я прав?

Это было полезно?

Решение

На самом деле, в текущей реализации MS Count (IEnumerable) есть ярлык, который проверяет, является ли IEnumerable ICollection и вызывает ли он Count .Таким образом, производительность должна быть сопоставимой для подсчета элементов.

ToList и toArray - это немного одно и то же.Если IEnumerable является ICollection , то вместо него вызывается метод CopyTo, который немного быстрее.

Итак, выберите то, что делает ваш код наиболее читаемым, и ориентируйтесь на ВАШ вариант использования, чтобы получить определенный ответ.

Обновить:Я провел наивный бенчмарк.

Начиная с массива: var items = Enumerable.Range(1,1000).ToArray();

  • вызов ToList() :25 мс / 10000
  • вызов toArray() :23 мс / 10000

Начиная с IEnumerable: var items = Enumerable.Range(1,1000);

  • вызов ToList() :168 мс / 10000
  • вызов toArray() :171 мс / 10000

Таким образом, в принципе, вы получаете сопоставимую производительность.

Другие советы

Если вы действительно обеспокоены производительностью, вам нужно перебрать IEnumerable и считать ее по ходу дела. Это избавляет от необходимости создавать новую коллекцию в целом, а пересечение нужно повторять только один раз:

void Foobar(string[] arr, Dictionary<string, string[]>)
{
   var t = arr.Intersect(dic.Keys);
   int count = 0;
   foreach(var item in t)
   {
      count++;
      ..
   }

   var j = count;
}

Но, как сказал кто-то другой: это пахнет микрооптимизацией. Если производительность действительно имеет значение в этой ситуации, по крайней мере, выполните профилирование производительности, чтобы выяснить, какой метод действительно самый быстрый для вас.

Разница, вероятно, настолько мала, что стоит просто использовать метод, который лучше соответствует вашим потребностям. Запах микрооптимизации.

И в этом случае, поскольку все, что вы делаете, перечисляет набор и подсчитывает набор (оба из которых вы можете сделать с помощью IEnumerable), почему бы просто не оставить его как IEnumerable < > ;?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top