3

我已经对看似简单的 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)

我一生都无法弄清楚如何在不诉诸排序的情况下获取整个对象(甚至索引)...

4

3 回答 3

6

同样,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  ) );
于 2011-03-18T23:26:25.793 回答
1

常规 LINQ 中没有这样的运算符可以避免对整个IEnumerable. 但你不是第一个需要解决方案的人。例如在这里查看 Jason 的答案(虽然它是MaxByC#,但你会明白):Simple LINQ question in C#

MinBy来自MoreLinq

于 2011-03-18T23:32:30.390 回答
0

你快到了。你应该发现

dim youngest = (From c in customers
                Order By c.age Ascending
                Select c).First

做你正在寻找的东西。(我是 C# 人,而不是 VB.NET 人,所以我的语法可能有点不对劲。)

于 2011-03-18T22:59:56.290 回答