【问题标题】:Sort an array and return all number that are smaller then X对数组进行排序并返回所有小于 X 的数字
【发布时间】:2013-02-11 10:59:52
【问题描述】:

使用 linq,我如何对数组进行排序,然后返回所有小于 X 的数字

对于排序,我使用它:(这是一个好方法吗?)

var sorted = (from number in array orderby number升序选择数字).ToArray();

所以我将它排序在“排序”数组中。

如何返回其中所有小于 X 的数字。

【问题讨论】:

  • 你能发一下这条线吗?我是 LINQ 的新手。
  • 蒂姆·施梅尔特在下面回答

标签: linq


【解决方案1】:

为什么要在过滤之前进行排序?这比先过滤并排序其余部分效率低:

var sorted = array.Where(i => i < x).OrderBy(i => i).ToArray(); 

或在查询语法中:

var sorted = (from i in array
              where i < x
              orderby i
              select i).ToArray(); 

Order of LINQ extension methods does not affect performance?(标题具有误导性,实际上OrderBy 是 E.Lippert 在他的回答中解释的顺序很重要的例外情况之一)

【讨论】:

  • 我如何“衡量”这种方法的复杂性?
  • @slash1z:我认为它是 O(n),因为Enumerable.Where 需要枚举数组以查找所有低于x 的数字。其余的将按Enumerable.OrderBy 排序,复杂度为 O(N log N)
  • 您能否建议如何查看 (from number in array orderby number descending select number).Distinct() 的复杂性,它是 O(n),因为它像一个简单的循环、Distinct() 或 Where 一样遍历数组中的每个值() 子句并没有增加更多的复杂性,对吧?
  • @slash1z:我想是的,看看:stackoverflow.com/questions/2799427/…
  • 非常感谢,很好的回答。
【解决方案2】:
var result = from n in array
             where n < value
             orderby n
             select n;

或者在方法语法中:

var result = array.Where(n => n < value).OrderBy(n => n);

如果你已经有排序数组,你也可以使用TakeWhile

var result = sortedArray.TakeWhile(n => n < value);

请记住,最好在排序之前过滤序列。为什么?因为当您进行排序时,所有项目都存储在内部排序结构中。因此,您必须排序的项目越少,您的代码运行速度就越快(并且使用的内存也更少)。

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2019-04-27
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多