2011-03-18 61 views
1

我已经做了很多搜索看起来是一个简单的LINQ问题,但我无法弄清楚如何从一个集合中获取对象指定的最小值(或最大值),而不诉诸排序是这样的:如何使用vb.net中的Linq选择一个对象

dim customers= GetCustomers() 

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

此(未测试的代码)结构工作正常,不同之处在于整个客户阵列必须进行排序并放入一个列表中只提取第一个值的目的。这不可能是达到最低限度的最佳方式!

注意,我想在这种情况下,整个Ç记录,可以这样做一个客户(一个典型的例子)的的最少年龄:

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) 

我不能为我的生活弄清楚如何得到整个对象(甚至索引),而不诉诸于排序...

回答

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 )); 
+0

**编辑过**我第一次遇到问题,现在是O(n)选择。 – 2011-03-18 23:48:54

+0

我最终使用聚合,它似乎很干净。谢谢。 – Hucker 2011-03-19 05:37:55

+0

我假设你的第一个问题,你需要接受一个解决你的问题的答案。 – 2011-03-19 05:46:14

0

你几乎那里。你应该发现,

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

做你在找什么。 (我是一个C#的家伙,不是一个VB.NET的家伙,所以我的语法可能会关闭一些。)

+0

这基本上是我的第一个查询做什么。因为您正在执行'按c.age排序',所以存在一种隐含的排序,它会增加O(NlogN)性能命中与我希望用Min函数查看的O(N)行为。 – Hucker 2011-03-18 23:27:13

+0

我知道这有一个隐含的排序。我读过你的问题意味着你试图避免ToList,而不是你想要完全避免这种类型。其他答案给O(N)行为,所以我更新我的没有好处。 – DocMax 2011-03-19 02:20:28

+0

实际上没有理由通过首先排序列表来排序。对MoveNext()的第一个也是唯一的调用可能只是返回最小的项目,而不是对整个列表进行排序,这将是O(N)。这对于具有ToList的原始版本来说是不可能的。在像Haskell这样的懒惰的eval语言中,它不会首先对列表进行排序,这将是O(N)。可悲的是,即使在.NET 4.0中,QSORT似乎也会首先让人们用LINQ玩游戏,而不是声明式 – 2011-03-20 00:01:10

1

有一个在常规LINQ没有这样的操作,这将避免理论值的排序整个IEnumerable。但你不是第一个需要解决方案的人。例如,下面看看杰森的回答(虽然它是MaxBy和C#,但你会得到一个想法):Simple LINQ question in C#

或者MinByMoreLinq

+0

聚合是一个迭代和聚合你可以选择没有排序,检查我的答案。 – 2011-03-18 23:49:43

+0

@Sanje,是的,同意。与'Aggregate'大多数查询看起来有点复杂,但仍然可以。感谢这个想法 – Snowbear 2011-03-19 00:18:46

相关问题