作者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)
推 sidetalker:Yap! It works. 非常感謝 07/05 23:11
→ sidetalker:找出所有最大者,以迴圈也是只要掃描一次,也許Linq可以 07/05 23:15