C# 将Linq函数存储到变量&;动态定义?

C# 将Linq函数存储到变量&;动态定义?,c#,linq,group-by,delegates,C#,Linq,Group By,Delegates,我有一个像这样的Linq查询 var results= StudentsList.GroupBy(x=> x.GroupID) .GroupBy(x=> x.Any(g=>g.IsQualified== true)) .Select(g=> g) .ToList(); 我想将部分x.Any(g=>g.IsQualified==true)存储到一个变量中,这样我就可以根据我的需求动态地更改它(例如:x.Any(g=>g.StudentName==“

我有一个像这样的Linq查询

var results= StudentsList.GroupBy(x=> x.GroupID)
    .GroupBy(x=> x.Any(g=>g.IsQualified== true))
    .Select(g=> g)
    .ToList();
我想将部分
x.Any(g=>g.IsQualified==true)
存储到一个变量中,这样我就可以根据我的需求动态地更改它(例如:
x.Any(g=>g.StudentName==“John”)
),而无需单独定义新的Linq查询。可能吗

伪代码

static void SomeFunction(Func<int, int> op)
  {
        var results= StudentsList.GroupBy(x=> x.GroupID)
            .GroupBy(x=> op))
            .Select(g=> g)
            .ToList();
  }

解决方案1

您可以使用
Func
来实现它

private static IEnumerable<IGrouping<int, StudentInfo>>  SomeFunction(List<StudentInfo> list, Func<StudentInfo, bool> selector)
{
    return list.GroupBy(x => x.GroupID)
                              .Where(g => g.Any(selector) )
                              .Select(g => g);
}
解决方案2(创建扩展方法)


您需要一个
Func
,其中我假设
GroupID
int
StudentList
Student
对象的集合,并且您总是希望第二个分组位于
bool
值上。并像
GroupBy(op)
一样使用它。我想如果它总是
x=>x.Any(…)
你可能想为
Any
传递谓词。看看GroupBy函数的方法签名,让你的SomeFunction在准确的时间内完成。如果您使用IQueryable,它将是
Expression
,如果您使用IEnumerable,它将是
Func
。您是我的导师!我得到这个错误
。。。当I 1)使IEnumerable非静态和2)使用
.ToList()时,并非所有代码路径都返回值
在最后更新收藏,而不是使用
返回列表返回项目。GroupBy…
@YoKidYo Hi@Phong,您想在这里投稿吗?
private static IEnumerable<IGrouping<int, StudentInfo>>  SomeFunction(List<StudentInfo> list, Func<StudentInfo, bool> selector)
{
    return list.GroupBy(x => x.GroupID)
                              .Where(g => g.Any(selector) )
                              .Select(g => g);
}
var result1 = SomeFunction(StudentsList, p => p.IsQualified == true);
var result2 = SomeFunction(StudentsList, p => p.Student == "Adam");
public static IEnumerable<IGrouping<int, StudentInfo>> ExtensionMethod_SomeFunction(this IEnumerable<StudentInfo> list, Func<StudentInfo, bool> selector) 
{
    return list.GroupBy(x => x.GroupID)
                              .Where(g => g.Any(selector) )
                              .Select(g => g);
}
var result3 = StudentsList.ExtensionMethod_SomeFunction(p => p.IsQualified == true);
var result4 = StudentsList.ExtensionMethod_SomeFunction(p => p.Student == "John");