【问题标题】:Not able to sort list in a certain way using OrderBy C# functionality无法使用 OrderBy C# 功能以某种方式对列表进行排序
【发布时间】:2019-01-21 16:22:30
【问题描述】:

编辑 - 右侧的正确结果(在下面的示例中)是 excel 是如何进行排序的,以及我试图在 C# 中使用 OrderBy 来完成什么。

我有以下 OrderBy 语句:

tempList.OrderBy(x => x.value);

并得到以下结果:

01P
41
90

但我需要它是以下内容:

41
90
01P

有没有办法使用 OrderBy 来完成这种类型的排序?我已经尝试添加 StringComparison.(type) 的所有变体,但我无法让排序工作。

非常感谢任何帮助!

更多示例如下:

Sorted by OrderBy:                        What is needed instead:

示例 1)

35                                        7
7                                         35

示例 2)

44K                                       692
692                                       44K

示例 3)

0EP                                       629
0ET                                       0EP
692                                       0ET

示例 4)

10W                                       110
110                                       10W

【问题讨论】:

  • 我猜你是在比较 ASCII
  • 这里的规则是什么?没有字母的东西比有字母的小吗?
  • 左边的结果是excel中的自定义排序是如何排序的
  • 当列类型为“auto”时,Excel 会执行各种魔法,它会测试内容是否为 数字排序,如果是则首先按数字排序。最好定义自己的规则并实现具有所需行为的IComparer<string>

标签: c# linq sorting sql-order-by


【解决方案1】:

我想你之前想要一个数字排序。尝试如下:

string[] myArray = { "0EP", "0ET", "692" };

var result = myArray.OrderBy(a => !int.TryParse(a, out var _)).ThenBy(a => a).ToList();

【讨论】:

    【解决方案2】:

    虽然我喜欢 kkoyuncu 的回答,但它依赖于两个 OrderBy。您可以通过使用自定义比较器来消除这种情况。

    public class CustomComparer : IComparer<string>
    {
       public int Compare(string stringA, string stringB)
        {
            var isValueAInt = int.TryParse(stringA, out var valueA);
            var isValueBInt = int.TryParse(stringB, out var valueB);
    
            if(isValueAInt && isValueBInt)
            {
                return valueA - valueB;
            }
            else if(isValueAInt && !isValueBInt)
            {
                return-1;
            }
            else if(!isValueAInt && isValueBInt)
            {
                return 1;
            }
            return String.Compare(stringA,stringB);
    
        }
    }
    

    现在你的代码看起来像,

    string[] myArray = { "35", "7","110","10W","0EP","0ET","692"};
    var comparer = new CustomComparer();
    var result = myArray.OrderBy(a=>a,comparer);
    

    输出

    7 
    35 
    110 
    692 
    0EP 
    0ET 
    10W 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2017-03-06
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2014-05-30
      • 1970-01-01
      相关资源
      最近更新 更多