【问题标题】:Compilation Error while iterating using Linq with multiple conditions使用具有多个条件的 Linq 进行迭代时出现编译错误
【发布时间】:2020-02-18 20:39:54
【问题描述】:

我正在构建一个执行以下操作的 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;}
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    Demo on 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=&gt; y.Student!="Adam" ) 应该是 !x.Any(y =&gt; y.Student =="Adam" )
    2. var firstItem = g.Where(x=&gt;x.University=="OPQ"); 应该是 var firstItem = g.First(x=&gt;x.University=="OPQ")

    【讨论】:

    • 我计划在.Select 子句中使用多个条件(例如:firstItemotherItemssomeOtherItems)。由于return firstItem; 只返回第一项,而不是otherItemssomeOtherItems,有没有办法可以摆脱return firstItem; 或者可能用更好的替换它?
    • 代替.Select(),也可以使用SelectMany来实现。
    • 您可以创建一个新问题,然后标记我。我愿意帮助你。
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多