英文和数字组合字符串排序问题(A1,A2,B1,B2)

今天工作遇到 英文和数字组合字符串排序的问题,故在此记录一下

问题看如下代码:

  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;
原文地址:https://www.cnblogs.com/Angel-szl/p/14252069.html