C# 将Linq函数存储到变量&;动态定义?
我有一个像这样的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==“
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");