• 英文和数字组合字符串排序问题(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;
  • 相关阅读:
    CountDownLatch、CyclicBarrier、Semaphore的区别
    Java最小堆解决TopK问题
    【转载】缓存穿透,缓存击穿,缓存雪崩解决方案分析
    缓存雪崩问题及处理方案
    memcached 缓存数据库应用实践
    Redis分布式锁的正确实现方式
    JVM垃圾回收--年轻代、年老点和持久代(转)
    策略模式—Java实现(转)
    (转) Redis哨兵的详解
    Hibernate中1+N问题以及解决方法
  • 原文地址:https://www.cnblogs.com/Angel-szl/p/14252069.html
Copyright © 2020-2023  润新知