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

看板C_Sharp (C#)作者 (賽托克)時間15年前 (2010/07/06 00:39), 編輯推噓0(008)
留言8則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《AmosYang (LetMeGoogleThatForYou)》之銘言: : 如果要「找出所有 age 為 max age 的 customer」 : 還是先跑一次 .Max() 再 select 吧 :p : 硬擠成一行或許辦得到,但大概會寫得很噁心 XD OK 我嚐試的結果如下 (回您信箱之後又作一些簡化) class Customer { public string Name; public int Age; } private void button1_Click(object sender, EventArgs e) { Customer[] customers = new Customer[] { new Customer { Name = "Alice", Age = 30 }, new Customer { Name = "Bob", Age = 35 }, new Customer { Name = "Clair", Age = 25 }, new Customer { Name = "Darren", Age = 35 } }; var oldest = customers.Aggregate(new List<Customer>(), (list, c) => { if(list.Count < 1 || c.Age > list[0].Age) return new List<Customer> { c }; if(c.Age == list[0].Age) list.Add(c); return list; }); foreach(Customer c in oldest) MessageBox.Show(string.Format("{0} {1}", c.Age, c.Name)); } 謝謝您的幫助 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.41.97

07/06 01:13, , 1F
要練 Linq 的話,可以把 .Count < 1 換成 !Any()
07/06 01:13, 1F

07/06 01:15, , 2F
list[0] 換成 list.First()
07/06 01:15, 2F

07/06 01:16, , 3F
底下的 foreach 可以換成 List.ForEach XD
07/06 01:16, 3F

07/06 02:30, , 4F
我有測過耶,list[n]的O(1)換成ElementAt(n)就變成O(n)
07/06 02:30, 4F

07/06 02:31, , 5F
!Any()則當然是O(n),使得我得了IEnumerable函數恐懼症
07/06 02:31, 5F

07/06 02:32, , 6F
能用List原生函數的我就儘量不轉成IEnumerable函數
07/06 02:32, 6F

07/06 08:31, , 7F
根據我自己的測試,光只是 "Any()" 的話,應該是 O(1)
07/06 08:31, 7F

07/06 08:33, , 8F
Linq 新鮮有趣,但若要寫得好讀且有效率…需要練習 :D
07/06 08:33, 8F
文章代碼(AID): #1CCWhPao (C_Sharp)
文章代碼(AID): #1CCWhPao (C_Sharp)