[問題] Linq 的 Max 如何取得具最大值的那個物件

看板C_Sharp作者 (賽托克)時間15年前 (2010/07/04 14:25), 編輯推噓2(202)
留言4則, 4人參與, 最新討論串1/3 (看更多)
問題描述: 三位顧客 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

07/04 22:54, , 1F
直接c.Age.Max() 不行嗎?
07/04 22:54, 1F

07/05 08:07, , 2F
var s = customer.OrderByDescending(x=>x.Age);
07/05 08:07, 2F

07/05 14:14, , 3F
where c.Age==customers.Max(x=>x.Age) select c;
07/05 14:14, 3F

07/05 23:04, , 4F
謝謝樓上簡化語法,也謝謝樓樓上 O(n lg n) 解法
07/05 23:04, 4F
文章代碼(AID): #1CC9dIEe (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #1CC9dIEe (C_Sharp)