简体   繁体   English

如何在linq的多级列表中计算所有项目

[英]How can I count all items in multi-level list in linq

I have multi-level list like this 我有这样的多级列表

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; }
    }

How can i count all item in this multi-level list use linq 我如何使用linq计算此多级列表中的所有项目

Which better between linq and foreach in this situation 在这种情况下linq和foreach之间哪个更好

you may want to check how many strings are in this nested list? 您可能要检查此嵌套列表中有多少个字符串?

        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

But if you want to count the lists too you must use this. 但是,如果您也想计算列表,则必须使用此列表。

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

I flipped + operands so it may be more clear. 我翻转了+操作数,因此可能更清楚。

You have to add 1 for every list you look into. 您必须为要查看的每个列表添加1。 So: 所以:

        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))));

You can add more list your self if you learn this algorithm. 如果您学习此算法,则可以添加更多列表。

如果您要计算Rd中的所有Bn,请使用SelectMany()

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

If you need to also check all instances where strings are not null or empty 如果还需要检查字符串不为null或为空的所有实例

Rd pack = new Rd();
int x = pack.Ru.Sum(node => node.Rc.Sum(cnode => cnode.Rcp.Count(ccnode => !String.IsNullOrWhiteSpace(ccnode.Bn))));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM