2015-04-16 36 views
10

Chcę użyć LINQ do wybrania unikalnej listy ciągów, przechowywanych jako lista wewnątrz obiektu. Obiekt ten jest przechowywany na liście wewnątrz innego obiektu. Trudno to wyjaśnić, oto przykład:Użyj LINQ, aby wybrać różne właściwości na listach list.

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

Korzystanie z klasy Master Chcę uzyskać listę unikalnych ciągi wartości w klasie danych. Próbowałem następujące:

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

Czy ktoś mi pokazać, jak to się robi?

+0

Więc chcesz wyraźną 'Data' wszystkich swoich' dane DataCollection' za zszyte razem? – ryanyuyu

+0

wyróżnij go w wewnętrznych parantezach, takich jak master.select (x => x.DataCollection.Select (y => y.value) .Distinct()). Twój metohd otrzymuje teraz odrębny mistrz, a nie odrębne wartości wewnętrzne – maximdumont

Odpowiedz

21

Można to zrobić w ten sposób, bezpośrednio przy użyciu publicznego DateCollection uczestnika:

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

Kluczem do bycia SelectMany "spłaszczyć" wybór.

9

SelectMany projekty listę list w jedną listę:

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