作者AmosYang (LetMeGoogleThatForYou)
看板C_Sharp
标题Re: [问题] Linq 的 Max 如何取得具最大值的那个物件
时间Mon Jul 5 15:06:53 2010
※ 引述《sidetalker (赛托克)》之铭言:
: 问题描述:
: 三位顾客 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 是这样
[deleted]
: 我想 Linq 应该有更方便的语法也可以得到相同结果,且不必用到那麽多变数
: 但不知道该怎麽写,可否请分享一下经验,谢谢
假设 customers 这 array 里没有 null ref 的话…
customers.Aggregate((c1, c2) => (c1 != null && c1.Age >= c2.Age) ? c1 : c2);
收工
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 65.87.177.87
补述:
上面那种写法是假设每个 customer 的 age 都不同,
理论上是 O(n) ,应该比用 OrderBy 的 O(n lg n) 快
如果正好有多个 customer 的 age 皆为 max age,
上面那种写法会传回第一个有 max age 的 customer
(把 >= 改成 > 的话则会传回最後一个有 max age 的 customer)
如果要「找出所有 age 为 max age 的 customer 」
还是先跑一次 .Max() 再 select 吧 :p
硬挤成一行或许办得到,但大概会写得很恶心 XD
※ 编辑: AmosYang 来自: 65.87.177.87 (07/05 15:14)
※ 编辑: AmosYang 来自: 65.87.177.87 (07/05 15:21)
1F:推 sidetalker:Yap! It works. 非常感谢 07/05 23:11
2F:→ sidetalker:找出所有最大者,以回圈也是只要扫描一次,也许Linq可以 07/05 23:15