在多个条件下使用Linq迭代时出现编译错误



我正在构建一个执行以下操作的Linq查询:

  • 遍历每组
  • 检查组中是否至少包含一名患有University= OPQ的学生
  • 确保同一组没有任何Student= Adam
  • 获取每组具有University= OPQ的学生中的第一个项目

输出

  • Emity(第2组(
  • White(第5组(

我尝试了什么

var results = StudentsList
.GroupBy(x => x.GroupID)
.Where(x=>x.Any(y=> y.University=="OPQ") && x.Any(y=> y.Student!="Adam" ))
.Select(g => 
{
var firstItem = g.Where(x=>x.University=="OPQ");
firstItem.IsQualified = true;
return firstItem;
}).ToList();
foreach(var item in results)
Console.WriteLine("Group:" + item.GroupID + " Student:" + item.Student +  " IsQualified:" + item.IsQualified);

我得到一个错误:

编译错误(第56行,第22列(:"System.Collections.Generic.IEnumerable"不包含"IsQualified"的定义,但没有扩展方法"IsQualified"接受类型的第一个参数"System.Collections.Generic.IEnumerable"可以是已找到(您是否缺少using指令或程序集引用?(

我的代码

List<StudentInfo> StudentsList = new List<StudentInfo>();
// Group 1
StudentsList.Add( new StudentInfo { Student="Gungun", University="cdf", GroupID = 1, IsQualified=false});
StudentsList.Add( new StudentInfo { Student="John", University="abc", GroupID = 1, IsQualified=false});
StudentsList.Add( new StudentInfo { Student="Jack", University="def", GroupID = 1, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Peter", University="abc", GroupID = 1, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Lemity", University="abc", GroupID = 1, IsQualified=false} );
// Group 2
StudentsList.Add( new StudentInfo { Student="Donald", University="def", GroupID = 2, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Olivia", University="ggh", GroupID = 2, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Emity", University="OPQ", GroupID = 2, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Emma", University="OPQ", GroupID = 2, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Alan", University="OPQ", GroupID = 2, IsQualified=false} );
// Group 3
StudentsList.Add( new StudentInfo { Student="Adam", University="yub", GroupID = 3, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Jacob", University="OPQ", GroupID = 3, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Matthew", University="OPQ", GroupID = 3, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Saint", University="abc", GroupID = 3, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Joshua", University="qer", GroupID = 3, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Aubrey", University="fef", GroupID = 3, IsQualified=false} );
// Group 4
StudentsList.Add( new StudentInfo { Student="Caleb", University="DEF", GroupID = 4, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Anna", University="ABC", GroupID = 4, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Chill", University="GHI", GroupID = 4, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Alexis", University="JKL", GroupID = 4, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="Zoe", University="MNO", GroupID = 4, IsQualified=false} );
// Group 5
StudentsList.Add( new StudentInfo { Student="Dylan", University="PQR", GroupID = 5, IsQualified=false} );
StudentsList.Add( new StudentInfo { Student="White", University="OPQ", GroupID = 5, IsQualified=false} );
public class StudentInfo
{
public string Student { get; set; }
public string University { get; set; }
public int GroupID { get; set; }
public bool IsQualified {get; set;}
}

在dotnet fiddle 上的演示

首先,您应该确保该组不包含任何Student == "Adam"

其次,您应该确保该组至少包含一个University == "OPQ"

最后,用University == "OPQ"获取每组的第一个项目

var results = StudentsList.GroupBy(x => x.GroupID)
.Where(g => !g.Any(p => p.Student == "Adam") && g.Any(x => x.University == "OPQ"))
.Select(g => 
{
var firstItem = g.First(x => x.University == "OPQ");
firstItem.IsQualified = true;
return firstItem;
}).ToList();

您的错误

  1. x.Any(y=> y.Student!="Adam" )应为!x.Any(y => y.Student =="Adam" )
  2. var firstItem = g.Where(x=>x.University=="OPQ");应为var firstItem = g.First(x=>x.University=="OPQ")

最新更新