2012-09-18 19 views
7

no puedo conocer la diferencia entre LinqQuery.ToList(). Distinct() y LinqQuery.Distinct(). ToList(); para mí, ambos se ven igual.por qué .ToList(). Distinct() arroja el error pero no el .Distinct(). ToList() con la consulta linq

consideran este código de ejemplo :

List<string> stringList = new List<string>(); 

List<string> str1 = (from item in stringList 
           select item).ToList().Distinct(); 

List<string> str2 = (from item in stringList 
           select item).Distinct().ToList(); 

str1 muestra un error como: ". No se puede convertir implícitamente el tipo 'System.Collections.Generic.IEnumerable' a 'System.Collections.Generic.List' Un explícita la conversión existe (¿falta un molde?) "

pero no hay error para str2.

Por favor, ayúdame a entender la diferencia entre estos dos. Gracias

+2

"tiros" tiende a ser utilizado para describir un error que se produce en tiempo de ejecución (por lo general una excepción). Considerando que este es un error de tiempo de compilación. –

Respuesta

18

.Distinct() es un método que opera en una IEnumerable<T>, y rendimientos un IEnumerable<T> (perezosamente evaluado). Un IEnumerable<T> es una secuencia: es no a List<T>. Por lo tanto, si desea terminar con una lista, coloque el .ToList() al final.

// note: this first example does not compile 
List<string> str1 = (from item in stringList 
          select item) // result: IEnumerable<string> 
         .ToList() // result: List<string> 
         .Distinct(); // result: IEnumerable<string> 

List<string> str2 = (from item in stringList 
          select item) // result: IEnumerable<string> 
         .Distinct() // result: IEnumerable<string> 
         .ToList(); // result: List<string> 

Para ilustración de por qué esto es así, considere la siguiente implementación de crudo de Distinct():

public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source) { 
    var seen = new HashSet<T>(); 
    foreach(var value in source) { 
     if(seen.Add(value)) { // true == new value we haven't seen before 
      yield return value; 
     } 
    } 
} 
+0

Para que str1 funcione, agregue "ToList() al final. Por lo tanto, se vería como tihs: xxx.ToList(). Distinct(). ToList() – Marty

+2

@Marty que sería indeseable; crea una lista innecesaria en el medio; sería preferible el código 'str2' existente. –

+0

Muchas gracias Marc :) –

Cuestiones relacionadas