当前位置:   article > 正文

C#字符串自定义排序_c# 自定义排序逻辑把特殊字符排在最后面

c# 自定义排序逻辑把特殊字符排在最后面

排序要求:按数字、文字、字母、符号的优先顺序排序

未排序:
yyds
1
air
2
#30
10
第8号
13
azure

系统默认排序结果:

#30
1
10
13
2
air
azure
yyds
第8号

要求排序后:

1
2
10
13
第8号
air
azure
yyds
#30

  1. private void StringSort()
  2. {
  3. List<string> list = new List<string>()
  4. {
  5. "azure",
  6. "1",
  7. "air",
  8. "2",
  9. "#30",
  10. "10",
  11. "第8号",
  12. "13",
  13. "yyds"
  14. };
  15. var sorted = list.OrderBy(o => o, MyComparer .Instance);
  16. }
  17. class MyComparer : IComparer<string>
  18. {
  19. public static readonly MyComparer Instance = new MyComparer();
  20. public static readonly string RegexNum = @"^[0-9]+";
  21. public static readonly string RegexHan = @"^[\u4e00-\u9fa5]+";
  22. public static readonly string RegexLetter = @"^[A-Za-z]+";
  23. public static readonly string RegexSymbol = @"^[^0-9A-Za-z\u4e00-\u9fa5]+";
  24. public int Compare(string x, string y)
  25. {
  26. if (double.TryParse(x, out double xd) && double.TryParse(y, out double yd))
  27. {
  28. //均由数字组成的比较
  29. return (int)(xd - yd);
  30. }
  31. else
  32. {
  33. bool xIsNum = Regex.IsMatch(x, RegexNum);
  34. bool yIsNum = Regex.IsMatch(y, RegexNum);
  35. bool xIsHan = Regex.IsMatch(x, RegexHan);
  36. bool yIsHan = Regex.IsMatch(y, RegexHan);
  37. bool xIsLetter = Regex.IsMatch(x, RegexLetter);
  38. bool yIsLetter = Regex.IsMatch(y, RegexLetter);
  39. bool xIsSymbol = Regex.IsMatch(x, RegexSymbol);
  40. bool yIsSymbol = Regex.IsMatch(y, RegexSymbol);
  41. if ((xIsNum && yIsNum) || (xIsHan && yIsHan) || (xIsLetter && yIsLetter) || (xIsSymbol && yIsSymbol))
  42. {
  43. //同样的字符开头,则正常比较
  44. return string.Compare(x, y);
  45. }
  46. else
  47. {
  48. //以数字、文字、字母、符号排序
  49. if (xIsNum)
  50. {
  51. return -1;
  52. }
  53. else if (yIsNum)
  54. {
  55. return 1;
  56. }
  57. else if (xIsHan)
  58. {
  59. return -1;
  60. }
  61. else if (yIsHan)
  62. {
  63. return 1;
  64. }
  65. else if (xIsLetter)
  66. {
  67. return -1;
  68. }
  69. else if (yIsLetter)
  70. {
  71. return 1;
  72. }
  73. else if (xIsSymbol)
  74. {
  75. return -1;
  76. }
  77. else if (yIsSymbol)
  78. {
  79. return 1;
  80. }
  81. return string.Compare(x, y);
  82. }
  83. }
  84. }
  85. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/651072
推荐阅读
相关标签
  

闽ICP备14008679号