今天工作遇到 英文和数字组合字符串排序的问题,故在此记录一下
问题看如下代码:
var list = new List<string>() { "B1", "B2", "A11", "A1", "A3", "A2" }; list = list.OrderBy(a => a).ToList(); foreach (var item in list) { Console.Write(item+";"); }
得到的结果:
A1;A11;A2;A3;B1;B2;
想要实现的效果是A11排在A3之后,但是通过默认排序 A11却处于A1和A2之间;故满足不了需求。
为了满足需求,便需要自定义排序方法
排序方法代码如下:
public class SemiNumericComparer : IComparer<string> { public int Compare(string x, string y) { try { var xc = GetHaveCharacter(x); var yc = GetHaveCharacter(y); if (string.Compare(xc, yc, false) == 0) { var numX = 0; int.TryParse(GetNoCharacter(x), out numX); var numY = 0; int.TryParse(GetNoCharacter(y), out numY); if (numX > numY) { return 1; } else if (numX < numY) { return -1; } else { return 0; } } else { return string.Compare(xc, yc); } } catch (Exception ex) { return 0; } } private string GetHaveCharacter(string str) { //获取字符串里面的英文字母 Regex re = new Regex(@"[a-zA-Z]+"); Match m = re.Match(str); return m.Value; } private string GetNoCharacter(string str) { //去除字符串里面的英文字母 return Regex.Replace(str, "[a-zA-Z]+", ""); } }
使用自定义排序:
var c = new SemiNumericComparer(); var list = new List<string>() { "B1", "B2", "A11", "A1", "A3", "A2" }; list = list.OrderBy(a => a,c).ToList(); foreach (var item in list) { Console.Write(item+";"); }
最后的结果:
A1;A2;A3;A11;B1;B2;