如何在vb.net中使用Linq选择单个对象

时间:2011-03-18 22:54:30

标签: vb.net linq lambda minimum

我已经做了很多搜索似乎是一个简单的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)

我不能为我的生活弄清楚如何在不诉诸排序的情况下获得整个对象(甚至索引)......

3 个答案:

答案 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#

来自MoreLinqMinBy

答案 2 :(得分:0)

你快到了。你应该找到那个

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

做你想要的。 (我是C#的家伙,不是VB.NET的人,所以我的语法可能会稍微偏离。)