使LINQ选择O(n),只选择一个元素

时间:2013-08-27 06:01:59

标签: c# performance linq

所以,我只选择LINQ查询中的一个元素(cars类型为Car[]):

Car selectedCar = (
    from x
    in cars
    where x.Location * direction > location * direction
    orderby x.Location * direction
    select x)
    .FirstOrDefault();

这基本上是一个O(n log n)操作(因为orderby)。我可以通过使用LINQ来降低约30%的性能,但是当它很容易成为带有循环的O(n)时,我不能将其设为O(n log n)。有没有办法保留LINQ,但减少了操作顺序?

2 个答案:

答案 0 :(得分:5)

Aggregate应该这样做:

Car selectedCar = cars
 .Where(x => x.Location * direction > location * direction)
 .Aggregate((a, b) => (a.Location * direction < b.Location * direction) ? a : b);

我没有检查这段代码是否真的有用,所以要小心。

答案 1 :(得分:-1)

试试这个:

Car selectedCar = cars.Where(x=>x.Location * direction > location * direction).Min(x=>x.Location * direction);