2015-04-16 6 views
10

Desidero utilizzare LINQ per selezionare un elenco univoco di stringhe, memorizzato come Elenco, all'interno di un oggetto. Questo oggetto è esso stesso memorizzato in una lista all'interno di un altro oggetto. E 'difficile da spiegare, ecco un esempio:Utilizzare LINQ per selezionare proprietà distinte in Elenchi di elenchi

public class Master 
{ 
    public List<DataCollection> DateCollection { get; set; } 
    public Master() { this.DateCollection = new List<DataCollection>(); } 
} 

public class DataCollection 
{ 
    public List<Data> Data { get; set; } 
    public DataCollection() { this.Data = new List<Data>(); } 
} 

public class Data 
{ 
    public string Value{ get; set; } 
    public Data() { } 
} 

Uso della classe Maestro, voglio ottenere una lista di stringhe valore unico nella classe di dati. Ho provato il seguente:

List<string> unique = master.Select(x => x.DataCollection.Select(y => y.Value)).Distinct().ToList(); 

Qualcuno può mostrarmi come è fatto?

+0

Così si desidera che il distinto 'data' di tutti i vostri dati di' DataCollection' spillati insieme? – ryanyuyu

+0

effettua distinti passaggi in paraste interne come master.select (x => x.DataCollection.Select (y => y.value) .Distinct()). Il tuo metohd in questo momento ottiene un maestro distinto non valori interiori distinti – maximdumont

risposta

21

che si può fare in questo modo, utilizzando direttamente il pubblico DateCollection membro:

var unique = master.DateCollection 
    .SelectMany(x => x.Data.Select(d => d.Value)) 
    .Distinct() 
    .ToList(); 

La chiave è SelectMany a "appiattire" la selezione.

9

SelectMany progetti una lista di liste in un unico elenco:

List<string> unique = master 
    .SelectMany(x => x.DataCollection.Select(y => y.Value)) 
    .Distinct() 
    .ToList();