简体   繁体   English

名单 <string> C#自定义排序。 在数字后加下划线

[英]List<string> C# custom sorting. Underscore after digits

I have a list: "a_a", "a1a", "aaa". 我有一个列表:“ a_a”,“ a1a”,“ aaa”。

I need to sort it in following way: "a1a", "a_a", "aaa". 我需要按以下方式对其进行排序:“ a1a”,“ a_a”,“ aaa”。

In other words I need '_' symbols to appear right after digits but before letters. 换句话说,我需要“ _”符号出现在数字之后但字母之前。

I know it is possible to use custom Comparer, but I haven't found any nice solution for this issue, only dirty hacks, for example: 我知道可以使用自定义的比较器,但是我没有找到任何解决此问题的好方法,例如,肮脏的黑客程序,例如:

Compare(string x, string y){

return Comparer.Default.Compare(x.Replace("_", "9z"), y.Replace("_", "9z"));

}

According to standard ASCII table: 根据标准ASCII表:

  '0'..'9' have codes 0x30..0x39
  '_'      -/-        0x5F
  'a'..'z' -/-        0x61..0x7A

so since codes are in right order, you can use ordinal comparison: 因此,由于代码顺序正确,因此可以使用顺序比较:

  List<String> list = new List<string> {
    "a1a", "a_a", "aaa"
  };

  list.Sort((Comparison<String>) (
    (String left, String right) => {
       return String.CompareOrdinal(left, right);
    }
  ));

  ...
  // a1a, a_a, aaa
  Console.Write(String.Join(", ", list)); 

Here's a custom string comparer which will take a char comparer, so you can compare characters however you want. 这是一个自定义字符串比较器,它将使用一个字符比较器,因此您可以根据需要比较字符。 That being said, make sure StringComparer.Ordinal doesn't do the job before implementing your own comparers. 话虽如此,在实现自己的比较器之前,请确保StringComparer.Ordinal不会执行此工作。

public class CustomStringComparer : IComparer<string>
{
    readonly IComparer<char> charComparer;
    public CustomStringComparer(IComparer<char> charComparer)
    {
        this.charComparer = charComparer;
    }
    public int Compare(string a, string b)
    {
        int result = 0;
        for (int i = 0; (i < a.Length || i < b.Length) && result == 0 ; i++)
        {
            if (i >= a.Length || i >= b.Length)
            {
                return i >= a.Length ? -1 : 1;
            }
            result = charComparer.Compare(a[i], b[i]);
        }
        return result;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM