2015-07-01 3 views
0

У меня есть многоуровневой списка как этогоКак я могу рассчитывать все элементы многоуровневого списка в LINQ

public class Rd { 
     public List<Ru> Ru = new List<Ru>(); 
    } 
    public class Ru { 
     public List<Rc> Rc = new List<Rc>(); 
    } 
    public class Rc { 
     public List<Rcp> Rcp = new List<Rcp>(); 
    } 
    public class Rcp { 
     public string Bn { get; set; } 
    } 

Как я рассчитывать весь пункт в этом списке использовании многоуровневого LINQ

Что лучше между LINQ и Еогеасп в этой ситуации

ответ

1

вы можете проверить, сколько строк находится в этом вложенном списке?

 List<Rd> a = YourList; 

     int count = 
      (from rd in a  // foreach (Rd rd in a) 
      from ru in rd.Ru // foreach (Ru ru in rd.Ru) 
      from rc in ru.Rc // foreach (Rc rc in ru.Rc) 
      from rcp in rc.Rcp // foreach (Rcp rcp in rc.Rcp) 
      select rcp)   // select rcp`s 
      .Count(rcp => rcp.Bn != null); // Count if rcp != null 

Но если вы хотите также сосчитать списки, вы должны использовать это.

 int countAll = a.Sum(rd => 
         rd.Ru.Sum(ru => 
         ru.Rc.Sum(rc => 
         rc.Rcp.Count(rcp => 
         rcp.Bn != null) + 1) + 1) + 1); 

Я перевернул + операнды, так что может быть более ясным.

Вы должны добавить 1 для каждого списка, в который вы смотрите. Итак:

 int countAll = a.Sum(rd => // foreach (Rd rd in a) add 1 to next Sum 
         1 + rd.Ru.Sum(ru => // foreach (Ru ru in rd.Ru) add 1 to next Sum 
          1 + ru.Rc.Sum(rc => // foreach (Rc rc in ru.Rc) add 1 to next Count 
           1 + rc.Rcp.Count(rcp => // Count rcp`s if rcp != null 
            rcp.Bn != null)))); 

Вы можете добавить больше своего списка, если вы изучите этот алгоритм.

+0

Я хочу countAll как это. Но если это более 4 уровня, то что я могу сделать – user1392853

+0

Спасибо. Я попробую – user1392853

0

, если вы имеете в виду посчитать все Bn в Rd, используйте SelectMany():

rd.SelectMany(z => Ru).SelectMany(z => Rc).SelectMany(z => Rcp).Count() 
+0

Я хочу, чтобы посчитать все детали не только Bn – user1392853

0

Если вам необходимо также проверить все случаи, когда строки не нулевые или пустые

Rd pack = new Rd(); 
int x = pack.Ru.Sum(node => node.Rc.Sum(cnode => cnode.Rcp.Count(ccnode => !String.IsNullOrWhiteSpace(ccnode.Bn)))); 
Смежные вопросы