2015-04-16 5 views
10

Ich möchte LINQ verwenden, um eine eindeutige Liste von Zeichenfolgen auszuwählen, die als Liste in einem Objekt gespeichert sind. Dieses Objekt wird selbst in einer Liste in einem anderen Objekt gespeichert. Es ist schwer zu erklären, hier ein Beispiel:Verwenden Sie LINQ, um verschiedene Eigenschaften in Listen der Listen auszuwählen

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() { } 
} 

der Master-Klasse verwenden, habe ich eine Liste von eindeutigen Wert Strings in der Datenklasse erhalten möchten. Ich habe folgendes versucht:

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

Kann mir jemand zeigen, wie es gemacht wird?

+0

Sie will also die deutliche 'Data' alles zusammen Ihr' DataCollection' Daten geheftet? – ryanyuyu

+0

machen distinct gehen in innere Klammern wie master.select (x => x.DataCollection.Select (y => y.value) .Distinct()). Ihr Metohd bekommt jetzt deutliche Masterwerte und keine ausgeprägten inneren Werte – maximdumont

Antwort

21

Sie können das so machen, direkt die Öffentlichkeit DateCollection Mitglied mit:

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

Der Schlüssel SelectMany zu „glätten“, um die Auswahl zu sein.

9

SelectMany Projekte eine Liste von Listen in eine einzige Liste:

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