我已经做了很多搜索似乎是一个简单的LINQ问题,但我无法弄清楚如何从具有指定最小值(或最大值)的集合中抓取一个对象而不诉诸于这样排序:
dim customers= GetCustomers()
dim youngest = (From c in customers
Order By c.age Ascending).ToList.First
此(未经测试的代码)结构可正常工作,但必须对整个客户数组进行排序并将其放入列表中,以便仅提取第一个值。这不是获得最低限度的最佳方式!
请注意,在这种情况下我想要整个c记录,不可以这样做的客户的最小年龄(典型示例):
dim customers= GetCustomers()
dim youngest = (From c in customers
Select c.age).Min
甚至
dim customers= GetCustomers()
dim youngest = (From c in customers
Select c).Min(Function(x) x.age)
我不能为我的生活弄清楚如何在不诉诸排序的情况下获得整个对象(甚至索引)......
答案 0 :(得分:5)
再次,C#代码,我不确定我是否在VB.NET中正确使用
<强> C#强>
Customer youngest = customers.Aggregate((c1, c2) => (c1.age < c2.age) ? c1 : c2);
<强> VB.NET 强>
dim youngest = customers.Aggregate( Function(ByVal c1, ByVal c2) IF( (c1.age < c2.age) , c1 , c2 ) );
答案 1 :(得分:1)
在常规LINQ中没有这样的运算符会避免对整个IEnumerable
进行排序。但你不是第一个需要解决方案的人。例如,在这里查看Jason的答案(尽管它是MaxBy
和C#,但你会得到一个想法):Simple LINQ question in C#
来自MoreLinq的MinBy
答案 2 :(得分:0)
你快到了。你应该找到那个
dim youngest = (From c in customers
Order By c.age Ascending
Select c).First
做你想要的。 (我是C#的家伙,不是VB.NET的人,所以我的语法可能会稍微偏离。)