【请教Tim】 Linq方面的问题

symbol_bc 2010-10-27 01:43:23
加入我又这样一个集合

List<Grade> gradeList = new List<Grade>() {
new Grade{ ID=1, UserID=100, _Grade=10, DT= DateTime.Parse("2010-10-12"),IsNormal=true },
new Grade{ ID=2, UserID=100, _Grade=20, DT= DateTime.Parse("2010-10-09"),IsNormal=true },
new Grade{ ID=3, UserID=200, _Grade=11, DT= DateTime.Parse("2010-10-11"),IsNormal=true },
new Grade{ ID=4, UserID=100, _Grade=18, DT= DateTime.Parse("2010-10-18"),IsNormal=true },
new Grade{ ID=5, UserID=300, _Grade=2, DT= DateTime.Parse("2010-10-10"),IsNormal=true },
new Grade{ ID=6, UserID=300, _Grade=15, DT= DateTime.Parse("2010-10-13"),IsNormal=true },
new Grade{ ID=7, UserID=300, _Grade=16, DT= DateTime.Parse("2010-10-02"),IsNormal=false }
};

我想求Grade最大的那行的那个对象
我这样写

var q = gradeList.Where(k => k._Grade == gradeList.Max(s => s._Grade));

这没什么问题
然后我想用另一种写法

var query1 = from g in gradeList
where g.ID.Equals(from f in gradeList select gradeList.Max(s => s.ID))
select g;

我这样写的时候,报错说无法将IEnumerable<int> 转化成int
我跟踪一下发现from f in gradeList select gradeList.Max(s => s.ID)这句返回的竟然不是一个int值而是一个集合而且集合中每个grade值都是相同的,都是最大值,这是为什么呢?
最后我只能用这种写法解决

var query1 = from g in gradeList
where g.ID.Equals((from f in gradeList select gradeList.Max(s => s.ID)).First())

是不是有什么其他方法呢?另外,我想问一下这两种写法应该没什么本质区别是吧?那什么时候用哪种呢?我觉得下面这种在笔记哦啊复杂的逻辑时应用,不知道对不对!

还请Tim分享一下这方面的心得。
...全文
165 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 symbol_bc 的回复:]
恩,思路比我的简单,其实我就是比较奇怪from f in gradeList select gradeList.Max(s => s.ID)
这句为什么不返回一个值,一定要加一个first,呵呵,可能是有点轴了。
[/Quote]

//把结果打印一下,你应该知道原因了吧...
var query1 = from f in gradeList select gradeList.Max(s => s.ID);

foreach(var q in query1)
{
Console.WriteLine(q);
}
/*
结果:
7
7
7
7
7
7
7

*/
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
q107770540 V5
q107770540 2010-10-27
  • 打赏
  • 举报
回复
不好意思,来晚了,上午抱儿子去打防疫针去也~~


var query1 = from g in gradeList
let maxId=gradeList.Max(g1=>g1.ID)
where g.ID.Equals(maxId)
select g;

foreach(var q in query1)
{
Console.WriteLine(q);
}
symbol_bc 2010-10-27
  • 打赏
  • 举报
回复
结贴,谢谢大家
symbol_bc 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wuyazhe 的回复:]
C# code
//按你意思写的
var query2 = (from g in gradeList orderby g._Grade descending select g).First();

//你的修改的
var query1 = from g in gradeList
where g.ID.Equals ((from f in gradeList s……
[/Quote]

恩,思路比我的简单,其实我就是比较奇怪from f in gradeList select gradeList.Max(s => s.ID)
这句为什么不返回一个值,一定要加一个first,呵呵,可能是有点轴了。
claymore1114 2010-10-27
  • 打赏
  • 举报
回复
select 出的当然是集合。
from f in gradeList select gradeList.Max(s => s.ID) // 你有7条,就会有7条一样的ID=7的记录
(from f in gradeList select f.ID).max() //先取出全部的ID,再 取最大的。

var query1 = from g in gradeList
where g.ID.Equals((from f in gradeList select f.ID).Max())
select g;
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
//按你意思写的
var query2 = (from g in gradeList orderby g._Grade descending select g).First();

//你的修改的
var query1 = from g in gradeList
where g.ID.Equals ((from f in gradeList select gradeList.Max(s => s.ID)).First())
select g;
symbol_bc 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wjq 的回复:]
Max()是返回一个值没错,但select是将所有结果封为一个结果集返回。

就好象你在sql里select之后,即便只有一行,也是一个数据集~
[/Quote]
那就是说,我只能加一个First了,感觉很别扭
symbol_bc 2010-10-27
  • 打赏
  • 举报
回复
我觉得这个和sql应该差不多,sql中where后面=的值一定是一个值,不能是一组值,那样会报错,
所以我觉得和这个有关系,但是不知道为什么max返回的是一组值,却不是一个,可以方法命名说返回值
是一个int的,大家可以看一下。
symbol_bc 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyazhe 的回复:]
C# code
var query1 = from g in gradeList
where g.ID.Equals(from f in gradeList select gradeList.Max(s => s.ID))
select g;
很正常,没报错。
[/Quote]

对对,不是报错,是没有结果,选不出来结果。
wjq 2010-10-27
  • 打赏
  • 举报
回复
Max()是返回一个值没错,但select是将所有结果封为一个结果集返回。

就好象你在sql里select之后,即便只有一行,也是一个数据集~
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
这样貌似能快一点。你求出max还要多次比较。不如直接排序后取第一个。
var query1 = (from g in gradeList orderby g._Grade select g).First();
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
这样貌似能快一点。你求出max还要多次比较。不如直接排序后取第一个。
var query1 = (from g in gradeList orderby g._Grade select g).First();
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
var query1 = from g in gradeList
where g.ID.Equals(from f in gradeList select gradeList.Max(s => s.ID))
select g;
很正常,没报错。
symbol_bc 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pxxxp 的回复:]
from f in gradeList select gradeList.Max(s => s.ID)
虽然只有一个值,但返回的是一个数据集

加个first()就是一个具体的值了
[/Quote]

gradeList.Max应该返回的就是一个int值才对啊,求最大值为什么要返回一个集合呢?

顶者有分都没人顶,快来顶!!
PxxxP 2010-10-27
  • 打赏
  • 举报
回复
from f in gradeList select gradeList.Max(s => s.ID)
虽然只有一个值,但返回的是一个数据集

加个first()就是一个具体的值了
symbol_bc 2010-10-27
  • 打赏
  • 举报
回复
沉得也太快了吧,顶者有分!

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧