【问题标题】:C# .NET sort method (filtering min and max values)C# .NET 排序方法(过滤最小值和最大值)
【发布时间】:2018-01-22 16:59:15
【问题描述】:

我正在对通用列表使用 .net 排序方法。例如:

MyList.Sort();

是否可以使用 .net 对包含最小值和最大值的列表进行排序?例如,如果我想对列表进行排序,同时只显示小于“value1”但大于“value2”的列表项。

类似这样的:

MyList.Sort.Where(MyList > 50 & MyList < 30);

【问题讨论】:

  • only show list items... 是什么意思?你想删除范围之外的那些吗?你想创建一个子集吗?如何展示?
  • 回答时请澄清OP在寻找什么,根据您的理解考虑edit该问题。到目前为止,尚不清楚预期的输出是什么(即 {1,37,35,100} -> {35,37} 或 {1,100} 或 {1,35,37,100} 或 {1,35,37,100} + print 35, 37).

标签: c# .net sorting


【解决方案1】:

你可以使用 Linq 扩展。

// top of code file
using System.Linq;

// code
var filteredSortedList = MyList.Where(x => x > 30 && x < 50).OrderBy(x => x);
// filters values between 30 and 50 not inclusive
// sorts the results

请注意,原始列表 MyList 没有更改,而是将结果分配给一个新变量。操作也会延迟,直到您对结果执行某些操作,例如调用 ToList 或枚举它。

【讨论】:

    【解决方案2】:

    我认为您的示例将产生零结果,因为没有任何内容大于 50 且小于 30。但假设这只是一个错字,这就是您所追求的吗?

     List<int> s = new List<int>();
     s.Where(r => r > 50 && r < 30).OrderBy(r => r);
    

    【讨论】:

    • 值得注意的是,这个表达式并没有改变原来的列表。您想使用该表达式的 return 值。
    【解决方案3】:

    你好,你可以像下面这样

    var res = MyList.Where(val => val > minVal && val < maxVal).OrderBy(num=>num).ToList();
    

    您不需要对列表进行排序,orderby 会为您完成

    【讨论】:

    • 为什么不同时使用.OrderBy(@object=&gt;@object) 让它更混乱:) 真的没有充分的理由使用var 作为变量名称(即使语法完全可以接受)。
    • @Maddy:我认为 Alexei 试图指出一个名为 var 的局部变量可能会引起混淆。我不得不承认我认为这是非法的,但显然不是。
    • @Chris:感谢您的解释,您可以使用任何变量名。我大部分时间都习惯使用 var 变量名我的坏
    • @Maddy:没问题。有时,如果您还没有看到问题,那么批评答案的更间接的方式可能会有点难以理解。
    【解决方案4】:

    对列表进行排序后,您可以使用 LINQ 对其进行过滤。在您的情况下,SkipWhileTakeWhile 似乎很有用:

    List<int> MyList = ....
    
    // sort
    MyList.Sort();
    
    // filter:
    var result = MyList.SkipWhile(i => i < 30).TakeWhile(i => i < 50).ToList();
    

    我不确定(意思是我没有测试),但我想大多数时候先过滤然后排序会更快,因此需要排序的元素更少。你可以使用LINQ的WhereOrderBy

    List<int> MyList = ....
    var result = MyList.Where(i => i > 30 && i < 50).OrderBy(i => i).ToList();
    

    请注意,我假设您的条件是错字,没有数字 i &lt; 30 &amp;&amp; i &gt; 50

    【讨论】:

    • “我不确定(意思是我没有测试),但我想大多数时候先过滤然后排序会更快” - 你当然可以说预期的比较次数会如果您先过滤,则更少。我想这在大多数情况下会转化为更快。
    【解决方案5】:

    你可以使用 linq 查询

    MyList = MyList
      .Where(x => x > 50 && x < 30)
      .OrderBy(x => x)
      .ToList();
    

    请注意,x &gt; 50 &amp;&amp; x &lt; 30 不会匹配任何项目。所以你可能想写

    MyList.Where(x => x > 30 && x < 50).OrderBy(x => x);
    

    这将删除任何小于 30 且大于 50 的项目

    【讨论】:

      【解决方案6】:

      这个版本应该可以在大多数版本的 .net 平台上运行。

          System.Collections.Generic.List<int> items = new List<int>();
          Predicate<int> FilterMethod = delegate (int item) { return item < 50 && item > 30; };
          items.FindAll(FilterMethod).Sort();
      

      【讨论】:

      • 这里不需要使用三元表达式,直接返回item &lt; 50 &amp;&amp; item &gt; 30即可。
      • @Chris:谢谢你的建议。
      猜你喜欢
      • 2019-04-18
      • 2017-10-13
      • 1970-01-01
      • 2018-10-09
      • 2017-08-01
      • 2019-03-19
      • 1970-01-01
      • 2011-03-27
      • 2013-05-06
      相关资源
      最近更新 更多