【问题标题】:How to include list based on a condition in LINQ如何根据 LINQ 中的条件包含列表
【发布时间】:2016-07-13 05:08:27
【问题描述】:

我有这个代码:

ClassroomList.Where(x => x.StudentList.Any(y => y.IsMale) == true);

仅当 StudentList 中的所有学生 IsMale == true 时,此代码才返回 ClassroomList,但如果至少有 1 个 IsMale == false,则返回无。

如何始终返回仅包含 IsMale == true 的学生的 ClassroomList。

这是 ClassroomList 的类:

public partial class ClassroomList
{
    public ClassroomList(){}
    public list<Student> StudentList {get; set;}
}

这里是学生班级:

public partial class Student 
{
    public Student (){}
    public bool IsMale {get; set;}
}

这是预期输出的示例

Classroomlist Count |  Studentlist Count |  Male | Female | 
         2                    5              3       2       
         2                    10             10      0
         2                    8              0       8

预期输出:

1. ClassroomList[1].Studentlist[2]
2. ClassroomList[1].Studentlist[9]
3. ClassroomList[1].Studentlist == null

【问题讨论】:

  • @Desperado 嗨谢谢我已经检查过了,它抛出一个错误,说不能将 IEnumerable 转换为 Icollection。是否不再需要使用 Any() 或 All() ?
  • 哦,主要错误是“实体或复杂类型..无法在 LINQ to Entities 查询中构造”
  • StudentList = x.StudentList.Where(y =&gt; y.IsMale).ToList()

标签: c# linq any


【解决方案1】:

添加一个内部 where 过滤器。

ClassroomList.Where(x =&gt; x.StudentList.All(y =&gt; y.IsMale) );

更新: 所以你需要这样吗?

ClassroomList.Select(x => new ClassroomList{ StudentList = x.StudentList.Where(y => y.IsMale).ToList() } );

【讨论】:

  • 这可以编译吗? x.StudentList.Where(y =&gt; y.IsMale) 不返回布尔值。
  • @user3185569 绝对是的!由于 StudentList 也是一个 IEnumerable
  • 试试看。它不会编译。 where 期望 Func&lt;T, bool&gt; 表示接受 ClassroomList 作为参数并返回 boolean 的函数。您的函数 x.StudentList.Where(y =&gt; y.IsMale) 不会返回 boolean。试试吧,你会得到一个编译时错误。
  • @user3185569 是的,你是对的。 All 是正确的 API,谢谢!
  • 您好,我不知道我的问题是否有误,因为所有答案都很常见,但这并不能解决我的问题。让我们看看,只有在 StudentList IsMale 中的所有 Student 的情况下,才返回给定 ClassroomList 的解决方案。 ClassroomList 应该始终有一个值,而 StudentList 将只有 Males
【解决方案2】:

根据编辑后的预期输出,您可以使用:

 var results = (from r in ClassroomList
               let grp = r.StudentList.GroupBy(x => x.IsMale)
               select new
               {
                   ClassRoomsCount = ClassroomList.Count(),
                   StudentsCount = r.StudentList.Count,
                   Male = grp.Where(x => x.Key).Count(),
                   Female = grp.Where(x => !x.Key).Count()
               }).ToList();

旁注:你可以删除这行public ClassroomList(){}编译器已经创建了一个隐藏的默认构造函数,所以不需要自己做。

【讨论】:

  • 您好,我不知道我的问题是否有误,因为所有答案都很常见,但这并不能解决我的问题。让我们看看,只有在 StudentList IsMale 中的所有 Student 的情况下,才返回给定 ClassroomList 的解决方案。 ClassroomList 应该始终有一个值,而 StudentList 将只有 Males。也感谢您的提示。我想我会编辑我的问题以添加更多详细信息
  • @user3770093 不清楚你想要什么。检查编辑。
【解决方案3】:

你们都在那里,只需使用All 扩展名。

ClassroomList.Where(x => x.StudentList.All(y => y.IsMale));

更新问题后,您似乎需要这样的东西。

var result = ClassroomList
                .Select(x=> new 
                 {
                     StudentListCount = x.StudentList.Count(),
                     MaleCount = x.StudentList.Count(c=>c.IsMale),
                     FemaleCount = x.StudentList.Count(c=>!c.IsMale),
                 };

【讨论】:

  • 如果这不是问题的答案,您可以随时使您的投票无效;-)
  • 我无法将其还原为 0,它会被否决:P。我知道这也是一个正确的答案,但我也回答了,所以我会为我的答案辩护:)
  • 您好,我不知道我的问题是否有误,因为所有答案都很常见,但这并不能解决我的问题。让我们看看,只有在 StudentList IsMale 中的所有 Student 的情况下,才返回给定 ClassroomList 的解决方案。 ClassroomList 应该始终有一个值,而 StudentList 将只有 Males
  • @user3770093 检查更新,这应该会产生您想要的输出
猜你喜欢
  • 2020-11-27
  • 2021-07-11
  • 2012-02-24
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多