2012-09-18 9 views
7

Nie jestem w stanie poznać różnicy między LinqQuery.ToList(). Distinct() i LinqQuery.Distinct(). ToList(); dla mnie oba wygląda tak samo.dlaczego .ToList(). Distinct() wyrzuca błąd, ale nie .Distinct(). ToList() z linq zapytanie

rozważyć ten przykładowy kod :

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 pokazuje błąd jako: „. Nie można niejawnie przekonwertować typu 'System.Collections.Generic.IEnumerable' do 'System.Collections.Generic.List' Wyraźne konwersja istnieje (czy brakuje Ci obsady?) "

, ale nie ma błędu dla str2.

Proszę, pomóż mi zrozumieć różnicę między tymi dwoma. Dzięki

+2

„rzuca” bywa używane do opisania błąd, który występuje w czasie wykonywania (zwykle wyjątek). Podczas gdy jest to błąd czasu kompilacji. –

Odpowiedz

18

.Distinct() jest to metoda, która działa na IEnumerable<T> i powracaIEnumerable<T> (leniwie analizowany). Numer IEnumerable<T> jest sekwencją: jest to , a nie a List<T>. Dlatego jeśli chcesz skończyć z listą, połóż na końcu .ToList().

// 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> 

Dla ilustracji, dlaczego tak jest, należy rozważyć następujące surowy realizację 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

Aby STR1 działał, dodaj "ToList() na końcu.Tak więc wyglądałoby to tak: xxx.ToList(). Distinct(). ToList() – Marty

+2

@Marty które byłoby niepożądane, tworzy niepotrzebną listę w środku, istniejący kod 'str2' byłby lepszy –

+0

Wielkie dzięki Marc :) –

Powiązane problemy