作者sidetalker (赛托克)
看板C_Sharp
标题[问题] Linq 的 Max 如何取得具最大值的那个物件
时间Sun Jul 4 22:25:17 2010
问题描述:
三位顾客 Alice, Bob, Clair 的芳龄分别是 30, 35, 25
请用 Linq 取得年龄最大的顾客,并显示其名字及年龄
理想的程式码可能是这样:
var customers = new[] {
new { Name = "Alice", Age = 30 },
new { Name = "Bob", Age = 35 },
new { Name = "Clair", Age = 25 }
};
var oldest = customers.Max(c => c.Age);
MessageBox.Show(string.Format("{0} {1}", oldest.Name, oldest.Age));
可是这里 Linq 的 Max 是传回 Age 的最大值,也就是 35,并非传回具最大值的那个物件
因此以上程式码是无法执行的
目前我所嚐试可执行的 Linq 是这样
var customers = new[] {
new { Name = "Alice", Age = 30 },
new { Name = "Bob", Age = 35 },
new { Name = "Clair", Age = 25 }
};
var oldest = from c in customers let maxage = customers.Max(x => x.Age)
where c.Age == maxage select c;
foreach(var c in oldest)
MessageBox.Show(string.Format("{0} {1}", c.Name, c.Age));
但是这种做法会扫描两次 customers,在取 Max 时一次,在比对 == maxage 时又一次
一般我们用回圈解类似问题时只要扫描一次即可,因此这样的解并不是很漂亮
考虑用回圈只扫描一次的做法
int maxage = int.MinValue;
var oldest = customers[0];
foreach(var c in customers) {
if(c.Age > maxage) {
maxage = c.Age; oldest = c;
}
}
MessageBox.Show(string.Format("{0} {1}", oldest.Name, oldest.Age));
我想 Linq 应该有更方便的语法也可以得到相同结果,且不必用到那麽多变数
但不知道该怎麽写,可否请分享一下经验,谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.41.97
1F:→ chancewen:直接c.Age.Max() 不行吗? 07/04 22:54
2F:推 pico2k:var s = customer.OrderByDescending(x=>x.Age); 07/05 08:07
3F:推 DearKurt:where c.Age==customers.Max(x=>x.Age) select c; 07/05 14:14
4F:→ sidetalker:谢谢楼上简化语法,也谢谢楼楼上 O(n lg n) 解法 07/05 23:04