作者sidetalker (賽托克)
看板C_Sharp
標題Re: [問題] Linq 的 Max 如何取得具最大值的那個物件
時間Tue Jul 6 00:39:49 2010
※ 引述《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
→ AmosYang:要練 Linq 的話,可以把 .Count < 1 換成 !Any() 07/06 01:13
→ AmosYang:list[0] 換成 list.First() 07/06 01:15
→ AmosYang:底下的 foreach 可以換成 List.ForEach XD 07/06 01:16
→ sidetalker:我有測過耶,list[n]的O(1)換成ElementAt(n)就變成O(n) 07/06 02:30
→ sidetalker:!Any()則當然是O(n),使得我得了IEnumerable函數恐懼症 07/06 02:31
→ sidetalker:能用List原生函數的我就儘量不轉成IEnumerable函數 07/06 02:32
→ AmosYang:根據我自己的測試,光只是 "Any()" 的話,應該是 O(1) 07/06 08:31
→ AmosYang:Linq 新鮮有趣,但若要寫得好讀且有效率…需要練習 :D 07/06 08:33