2009-08-26 15 views

Respuesta

49

Unión elimina duplicados. Concat no lo hace.

Por lo tanto, producen resultados diferentes si las fuentes contienen algún elemento en común o tienen algún duplicado interno.

Si puede garantizar que no hay duplicados, o si hay pocos y no le importa tenerlos en su salida, Concat será más rápido ya que no hay necesidad de probar cada valor con respecto a lo que ya se ha obtenido.

Sin embargo, si hay muchos duplicados y no los necesita, el procesamiento adicional en Union para eliminar los duplicados puede compensarse con los ahorros en el código que consume los resultados.

9

¿Solo le preocupa la velocidad de ejecución? ¿Cuánto tiempo te lleva procesar un elemento cuando lo recibes?

Concat es más simple: no necesita realizar ningún procesamiento en sí mismo, ni amortiguar los resultados que ya se devolvieron. Sin embargo, producirá más resultados si hay elementos en la intersección. Si va a tomar mucho tiempo procesar cada resultado, Concat puede terminar efectivamente siendo más lento.

+0

En mi caso, usaré un Distinct() al final, lo que favorece el uso de Union, creo. –

+6

Si usa Union, entonces no necesita llamar a Distinct después de todos modos. –

+2

Union elimina los duplicados entre las listas, pero si la primera lista tiene duplicados dentro de ellos, la unión no los eliminará. Por lo tanto, puede ser necesario llamar a Distinct, dependiendo de las circunstancias. –

3

Lo dicho anteriormente es correcto. Esta es sólo una pequeña adición de algunos casos especiales:

Si tiene que concatenar dos listas, por ejemplo, y si necesita toda velocidad, considere el uso rendimiento. Por supuesto, esto es mucho menos flexible y cómodo que Unión o Concat en Linq. Por lo tanto, solo tiene sentido en casos especiales.

Esta propiedad, por ejemplo, proporcionará la misma que List1.Concat (Lista2)

public IEnumerable<MyObject> AllObjects 
    { 
     get 
     { 
      foreach (MyObject o1 in List1) 
       yield return o1; 

      foreach (MyObject o2 in List2) 
       yield return o2; 
     } 
    } 
+0

'Concat' exactamente lo hace como lo muestra en el ejemplo (vea: [fuente] (https://referencesource.microsoft.com/#System.Core/System/Linq/ Enumerable.cs # 800)). Entonces no hay necesidad de implementarlo por su cuenta. – scher

Cuestiones relacionadas