Después de ejecutar este código:

var input = new List<T>( ... );
var result = input.Select( t => new U(t) );

U first1 = null;
foreach ( U u1 in result )
    if ( first1 == null )
        first1 = u1;

U first2 = null;
foreach ( U u2 in result )
    if ( first2 == null )
        first2 = u2;

A continuación, ‘first1 == first2’, se evalúa a false, aunque tanto la U de envolver el mismo T. yo no lo he probado aún, pero creo que se puede hacer para evaluar a la verdad por el encadenamiento de una .ToList() o .ToArray() en el Seleccione() la llamada.

En el código real, que es mucho más complejo de lo que esta simple ilustración, lo que es una buena regla del pulgar para usar para decidir si .ToList() o .ToArray() se debe anexar? Mis primeros pensamientos son cualquier referencia a la expresión que puede repetirse más de una vez o, para ser más seguro en caso de que el potencial de iteraciones no son evidentes, cualquier referencia a la expresión cuyo resultado nunca va a cambiar.

  • Está usted seguro de first1 == first2 es falsa? La iteración en la misma colección debe devolver el mismo objeto cada vez.
  • Sí, estoy seguro. Es la misma expresión, pero no de la misma colección.
  • Es falso porque U utiliza el estándar de referencia de la igualdad. En cada iteración causas de la secuencia a ser re-evaluado, por lo que obtener nuevos U instancias.
  • posibles duplicados de Es mejor llamar ToList() o el método ToArray() en las consultas de LINQ?
  • El problema es que crear un new U cada vez que iterar a través de la colección? O que los nuevos U(t) != new U(t)? Lazyness tiene consecuencias. Si esas consecuencias son deseables o no depende del caso de uso.
InformationsquelleAutor HappyNomad | 2012-08-18

2 Comentarios

  1. 17

    Por desgracia, creo que no es un buen «duro y rápido» regla de aquí. Depende mucho de cómo se espera que los resultados serán utilizados, y lo que la pregunta en sí está haciendo en realidad.

    Mis primeros pensamientos son cualquier expresión que puede repetirse más de una vez o, para ser más seguro en caso de que el potencial de iteraciones no son evidentes, cualquier expresión cuyo resultado nunca va a cambiar.

    En general, si usted va a utilizar el resultado de una consulta más de una vez, siempre es una buena idea para el almacenamiento a través de ToList() o ToArray(). Esto es especialmente cierto si usted está de consulta de LINQ es un «caro», ya que impide la operación costosa de ejecutar más de una vez.

    Normalmente, si usted sólo va a enumerar los resultados, entonces yo sería dejarlo como IEnumerable<T>. Si va a almacenar los resultados, o el uso de los resultados más de una vez, luego guardarlo en una colección puede ser beneficioso.

    Otro lugar para ver es si el retorno de los resultados en una API pública. Aunque a menudo es agradable volver IEnumerable<T>, dependiendo del uso previsto el caso, puede que desee considerar el uso de ToList() para evitar que la operación se ejecute más de una vez.

    Como para uso ToList() o ToArray(), realmente depende de cómo va a utilizar los resultados. El costo asociado con cada uno es casi idéntica (ToList() en realidad tiene un poco de ejecución inferior sobrecarga si la entrada no es ICollection<T>). Normalmente, prefiero ToList() más de ToArray() a menos que tenga una necesidad específica o el deseo de una matriz.

    • Gran punto sobre el público valor de retorno. Me he quedado en ese caso antes.
    • Y de la misma precaución se aplica cuando eres el resultado de pasar a otro método.
  2. 3

    ToList llamadas List<T>(IEnumerable<T>) constructor para crear un List<T>, mientras que ToArrary utiliza una clase interna Buffer<T> a crecer la matriz.

    Si el origen de la colección (IEnumerable<T>) implementa el ICollection interfaz, los dos métodos es similar a la de la lógica de código para copiar los datos.

    ICollection.CopyTo(array, 0);  

    De lo contrario, ToList se crea el List<T> de forma dinámica. Mientras ToArray copia el elemento uno por uno en una nueva matriz. Si la matriz es completa, el método se duplica el tamaño de la matriz para almacenar los datos. Finalmente, el método devuelve otra matriz basada en el origen de la colección de tamaño.

    • FYI – ToList() y el método ToArray() uso casi idénticos mecanismos de construcción (duplicando el tamaño de la matriz, etc). La principal diferencia es que el método ToArray es potencialmente más caro ya que por lo general se necesita un extra de la matriz de copia en el final, ya que se tiene que obtener el tamaño de salida para que coincida con la capacidad.
    • FYI – Su pregunta sugiere su título a esta respuesta, pero el texto de la pregunta no (he intentado incluir ambas opciones en mi respuesta, porque de eso)

Dejar respuesta

Please enter your comment!
Please enter your name here