2010-10-19 16 views
5

Ho una classe chiamata "Ordini" che ha la proprietà di "Città" tra gli altri. Sto provando a scrivere un'istruzione LINQ che otterrà tutte le città distinte da un elenco di ordini e le restituirà come un elenco di stringhe.Aiuto con LINQ distinto()

Ecco quello che ho ora.

Tuttavia, quando eseguo questo passandogli una lista di ordini, non riesco a recuperare nulla. L'elenco è vuoto che sta tornando. Gli ordini che sto passando hanno tutti i valori della città. Sono così stanco di fare questo sbagliato? Grazie!

risposta

12

Si sta errando il metodo Distinct().

Change a

return orders.Select(o => o.City).Distinct().ToList(); 

Oppure, utilizzando la sintassi di query di comprensione:

return (from o in orders 
     select o.City 
     ).Distinct().ToList(); 

(Nota parentesi)

il codice chiama Distinct sulla proprietà City in sé, che è una stringa .
Poiché gli strumenti della classe StringIEnumerable<char>, questo metodo restituisce un IEnumerable<char> contenente tutti i caratteri univoci nella stringa.
Quindi si chiama ToString() su questo enumerabile (che è un tipo di iteratore generato dal compilatore da System.Core.dll), che restituisce sempre System.Linq.Enumerable+d__81`1[System.Char].

Invece, è necessario chiamare .Distinct() su IEnumerable<string> restituito dal metodo Select.

+0

Oops, non so come sia arrivato quel C in più. Questo è solo un errore di battitura sul post. Il codice è selezionare s.City.Distinct(). ToString(); – twal

+0

Ok penso di aver capito. grazie. Farò il cambiamento e darò un colpo. Grazie – twal

+0

Perfetto! Ti ringrazio! – twal

1

È possibile attenersi al modo in cui si sta effettuando la chiamata con piccole regolazioni ... è necessario avvolgere l'area di selezione, quindi chiamare Distinct() su di esso e quindi inviarlo a List.

List<string> cities = (from o in orders 
         select o.City).Distinct().ToList(); 

      return cities;