C# 对另一个对象列表中的对象列表中的元素数进行计数的LinQ查询

C# 对另一个对象列表中的对象列表中的元素数进行计数的LinQ查询,c#,linq,C#,Linq,我有这样的结构: 首先,有一个家庭列表 编辑:每个家庭包含一组人 编辑:每个人都由性别定义 我要数一数这些人中有多少是男性,有多少是女性,所以我试了一下: int boys = ListOfFams.Where(f => f.persons.Where(p => p.gender == gender.male)).Count(); 似乎我不能只要求男性或女性的数量,因为我需要在第一个位置之后设置一个条件,但是,我不知道我应该如何构建我的请求 你们知道吗 谢谢你抽出时间 再次编辑:感

我有这样的结构:

首先,有一个家庭列表

编辑:每个家庭包含一组人

编辑:每个人都由性别定义

我要数一数这些人中有多少是男性,有多少是女性,所以我试了一下:

int boys = ListOfFams.Where(f => f.persons.Where(p => p.gender == gender.male)).Count();
似乎我不能只要求男性或女性的数量,因为我需要在第一个位置之后设置一个条件,但是,我不知道我应该如何构建我的请求

你们知道吗

谢谢你抽出时间

再次编辑:感谢大家的回答,很抱歉对有关人员组等问题的编辑太晚。

您只需使用LINQ,即可实现:

int boy = ListOfFams.Sum(f => f.persons.Count(p => p.gender == gender.male));
这将统计每个家庭的男性人数,并总结结果

如果您希望这些集合中的任何一个包含空值,则需要像这样进行保护:

int boy = ListOfFams.Sum(f => f?.persons?.Count(p => p?.gender == gender.male) ?? 0);
现在,这只统计不为null的男性,以及不为null且其人员列表不为null的家庭人员。 如果家庭或个人集合为空,则将其计为0。

您只需使用LINQ,即可实现此目的:

int boy = ListOfFams.Sum(f => f.persons.Count(p => p.gender == gender.male));
这将统计每个家庭的男性人数,并总结结果

如果您希望这些集合中的任何一个包含空值,则需要像这样进行保护:

int boy = ListOfFams.Sum(f => f?.persons?.Count(p => p?.gender == gender.male) ?? 0);
现在,这只统计不为null的男性,以及不为null且其人员列表不为null的家庭人员。
如果一个家庭或个人集合为空,则将其计为0。

如果您选择每个家庭,然后返回其中的男性计数,您将获得计数的可枚举数-例如{0,1,0,3,2,1}-您可以简单地对这些计数求和

  ListOfFams.Select(f => f.persons.Where(p => p.gender == gender.male).Count()).Sum();

//to reject nulls

ListOfFams.
    Where(f => f != null && f.persons != null).
    Select(f => f.persons.
    Where(p => p != null && p.gender == gender.male).
    Count()).
    Sum();

如果您选择每个家庭,然后返回其中的男性计数,您将获得计数的可枚举数-例如{0,1,0,3,2,1}-然后您可以简单地将这些计数相加

  ListOfFams.Select(f => f.persons.Where(p => p.gender == gender.male).Count()).Sum();

//to reject nulls

ListOfFams.
    Where(f => f != null && f.persons != null).
    Select(f => f.persons.
    Where(p => p != null && p.gender == gender.male).
    Count()).
    Sum();

其他答案也是正确的,但还有第三种方法

基本上,你对家庭不感兴趣,而是对那些家庭中的人感兴趣。与对每个族执行一次嵌套计数然后求和不同,您还可以:

将族列表转换为这些族中的人员列表 当然,这也可以链接:

int totalMales = ListOfFams
                     .SelectMany(fam => fam.persons)
                     .Count(person => person.gender == gender.male);
如果您担心可空性,您可以添加额外的空检查,尽管我通常建议首先避免在列表中使用空检查

int totalMales = ListOfFams
                     .Where(fam => fam != null && fam.persons != null)
                     .SelectMany(fam => fam.persons)
                     .Count(person => person != null && person.gender == gender.male);

其他答案也是正确的,但还有第三种方法

基本上,你对家庭不感兴趣,而是对那些家庭中的人感兴趣。与对每个族执行一次嵌套计数然后求和不同,您还可以:

将族列表转换为这些族中的人员列表 当然,这也可以链接:

int totalMales = ListOfFams
                     .SelectMany(fam => fam.persons)
                     .Count(person => person.gender == gender.male);
如果您担心可空性,您可以添加额外的空检查,尽管我通常建议首先避免在列表中使用空检查

int totalMales = ListOfFams
                     .Where(fam => fam != null && fam.persons != null)
                     .SelectMany(fam => fam.persons)
                     .Count(person => person != null && person.gender == gender.male);

你试过int boys=ListOfFams.SelectManys=>s.persons.Countp=>p.gender==gender.male;?我只是编辑了我的问题,因为我意识到我写错了,对不起,这意味着我需要在第一个问题之后加上一个条件,在哪里?你想按条件选择人员然后按性别统计吗?我的意思是男性和其他信息型人员之间缺少一些信息:你是否尝试过int boys=ListOfFams.SelectManys=>s.persons.Countp=>p.gender==gender.male;?我只是编辑了我的问题,因为我意识到我写错了,对不起,这意味着我需要在第一个问题之后加上一个条件,在哪里?你想按条件选择人,然后按性别计算吗?我的意思是男性和其他人之间缺少一些信息:似乎这可能有用。你知道如果一个家庭/一个群体/一个人等于null,它是否会引发异常吗?@RyanL是的,如果其中任何一个为null,它当然会抛出。我明白了。有没有办法忽略这些异常并继续计数?谢谢,这可能有用。你知道如果一个家庭/一个群体/一个人等于null,它是否会引发异常吗?@RyanL是的,如果其中任何一个为null,它当然会抛出。我明白了。有没有办法忽略这些异常并继续计数?谢谢你的回答谢谢你的回答我会尽快尝试谢谢你的回答我会尽快尝试