2015-11-19 2 views
0

Хорошо, вот что у меня есть.C# - LINQ выберите отличный от списка, который содержит список

public class A 
{ 
    //Properties 

    List<B> listB; 

    //Methods 
} 

public class B 
{ 
    //Properties 

    public struct C 
    { 
     public byte D 
     { 
      get; 
      set; 
     } 

     //Other propeties 
    } 

    public List<C> listC; 

    //Methods 
} 


//..somewhere 
A mydataA = new A(); 
mydataA.listB = new List<B>(); 
mydataA.listB.listC = new List<C>(); 

mydataA.listB.listC = JsonConvert.DeserializeObject<List<C>>(json); 
//C.D will take values like 1, 2, 1, 2, 2, 3, 5, 2 

нужно выбрать различные значения D от каждого C, поэтому результат будет список 1, 2, 3, 5. На данный момент, я выбрать различные данные, как это:

List<byte> mylist = new List<byte>(); 
foreach(var each_of_B in A.listB) 
{ 
    foreach(var each_of_C in each_of_B.C) 
    { 
     mylist.Add(each_of_C.D); 
    } 
} 

var res = mylist.GroupBy(t => t).Select(g => g.First()).ToList(); 

Но это не очень здорово, потому что я должен создать новый список, создать несколько петель. Есть ли способ выбрать отдельные данные с одной строкой, например var res = mydataA.***.Select(g => g.First()).ToList();, где *** - это то, что мне нужно?

ответ

2

SelectMany является то, что вы ищете:

var res = A.listB.SelectMany(b => b.C).Select(c => c.D).Distinct().ToList(); 
+0

Отлично! Спасибо! знак равно – Vlad

Смежные вопросы