作者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
1F:→ AmosYang:要练 Linq 的话,可以把 .Count < 1 换成 !Any() 07/06 01:13
2F:→ AmosYang:list[0] 换成 list.First() 07/06 01:15
3F:→ AmosYang:底下的 foreach 可以换成 List.ForEach XD 07/06 01:16
4F:→ sidetalker:我有测过耶,list[n]的O(1)换成ElementAt(n)就变成O(n) 07/06 02:30
5F:→ sidetalker:!Any()则当然是O(n),使得我得了IEnumerable函数恐惧症 07/06 02:31
6F:→ sidetalker:能用List原生函数的我就尽量不转成IEnumerable函数 07/06 02:32
7F:→ AmosYang:根据我自己的测试,光只是 "Any()" 的话,应该是 O(1) 07/06 08:31
8F:→ AmosYang:Linq 新鲜有趣,但若要写得好读且有效率…需要练习 :D 07/06 08:33