Necesito recorrer y el recuento.¿Cuál es el más rápido o preferido:ToArray() o ToList()?[duplicar]

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

Pregunta

Posibles Duplicados:
Es mejor llamar ToList() o el método ToArray() en las consultas de LINQ?

Tengo un código como este:

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
}

qué método es el preferido?

Yo podría ir sin ningún pero necesito saber el tamaño y no quiero llamar Enumerable.Count<T>() - parece hacer más acciones y, a continuación, Array<T>.Size o List<T>.Count.Estoy en lo cierto?

¿Fue útil?

Solución

En realidad, en la implementación actual de MS de Count (IEnumerable) hay un atajo que busca si IEnumerable es una ICollection y llama a Count en él. Por lo tanto, el rendimiento debe ser comparable para contar elementos.

ToList y ToArray son un poco lo mismo. Si IEnumerable es una ICollection, se llama al método CopyTo, que es un poco más rápido.

Por lo tanto, elija qué hace que su código sea más legible y el punto de referencia para que SU caso de uso tenga una respuesta definitiva.

Actualización: Hice un punto de referencia ingenuo.

Comenzando con una matriz: var items = Enumerable.Range(1,1000).ToArray();

  • llamando a ToList (): 25ms / 10000
  • llamando a ToArray (): 23 ms / 10000

Comenzando con un IEnumerable: var items = Enumerable.Range(1,1000);

  • llamando a ToList (): 168ms / 10000
  • llamando a ToArray (): 171 ms / 10000

Así que básicamente obtienes un rendimiento comparable.

Otros consejos

Si usted está realmente preocupa el rendimiento, debe recorrer el IEnumerable y lo cuentan como usted va.Esto evita tener que crear una nueva colección en conjunto, y la intersección sólo tiene que repetirá una vez:

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;
}

Pero como alguien dijo:esto huele de micro-optimización.Si el rendimiento que realmente importa en esta situación, al menos, hacer perfiles de rendimiento para saber qué método es realmente la forma más rápida para usted.

La diferencia es probablemente tan pequeña que vale la pena usar el método que mejor se adapte a sus necesidades. Huele a microoptimización.

Y en este caso, dado que todo lo que está haciendo es enumerar el conjunto y contar el conjunto (que puede hacer con un IEnumerable), ¿por qué no dejarlo como un IEnumerable < > ;?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top