当前位置: 首页 > article >正文

c# 自定义字符串排序

场景:List 需要按照某字段属性排序

字段数据存在如1,2,F1,F2,楼层3,F3,楼层11,

需要按照1,2,F1,F2,F3,楼层3,楼层11 来排序

public class NumericStringComparer : IComparer<string>
{
    public static readonly NumericStringComparer Instance = new NumericStringComparer();

    public static readonly string RegexNum = @"^[0-9]+";
    public static readonly string RegexHan = @"^[\u4e00-\u9fa5]+";
    public static readonly string RegexLetter = @"^[A-Za-z]+";
    public static readonly string RegexSymbol = @"^[^0-9A-Za-z\u4e00-\u9fa5]+";

    public int Compare(string x, string y)
    {
        if (double.TryParse(x, out double xd) && double.TryParse(y, out double yd))
        {
            //均由数字组成的比较
            return (int)(xd - yd);
        }
        else
        {
            bool xIsNum = Regex.IsMatch(x, RegexNum);
            bool yIsNum = Regex.IsMatch(y, RegexNum);

            bool xIsHan = Regex.IsMatch(x, RegexHan);
            bool yIsHan = Regex.IsMatch(y, RegexHan);

            bool xIsLetter = Regex.IsMatch(x, RegexLetter);
            bool yIsLetter = Regex.IsMatch(y, RegexLetter);

            bool xIsSymbol = Regex.IsMatch(x, RegexSymbol);
            bool yIsSymbol = Regex.IsMatch(y, RegexSymbol);

            if ((xIsNum && yIsNum) || (xIsHan && yIsHan) || (xIsLetter && yIsLetter) || (xIsSymbol && yIsSymbol))
            {
                //同样的字符开头,则正常比较
                return string.Compare(x, y);
            }
            else
            {
                //以数字、文字、字母、符号排序
                if (xIsNum)
                {
                    return -1;
                }
                else if (yIsNum)
                {
                    return 1;
                }
                else if (xIsHan)
                {
                    return -1;
                }
                else if (yIsHan)
                {
                    return 1;
                }
                else if (xIsLetter)
                {
                    return -1;
                }
                else if (yIsLetter)
                {
                    return 1;
                }
                else if (xIsSymbol)
                {
                    return -1;
                }
                else if (yIsSymbol)
                {
                    return 1;
                }

                return string.Compare(x, y);
            }
        }
    }
}

示例:

list.OrderBy(s => s.Name, new NumericStringComparer());


http://www.kler.cn/a/321002.html

相关文章:

  • 数据仓库在大数据处理中的作用
  • IQ Offset之工厂实例分析
  • Javascript_设计模式(二)
  • T265相机双目鱼眼+imu联合标定(全记录)
  • Essential Cell Biology--Fifth Edition--Chapter one (6)
  • 如何保证MySQL与Redis缓存的数据一致性?
  • Vue引入js脚本问题记录(附解决办法)
  • CAD 3dsmax maya等autodesk系列专用卸载修复工具AutoRemove,一键完全彻底卸载删除软件的专用卸载工具
  • jmeter性能测试---csv数据文件设置
  • Linux下线程间的通信
  • 11. Map和Set
  • java mybaits oracle插入返回主键
  • 9.26作业
  • Python中的文件编码:揭开字符世界的神秘面纱
  • 【HTTPS】—— HTTPS协议原理详解
  • 基于web的生产信息管理系统的设计与实现
  • netty编程之基于websocket发送二进制数据
  • 责任链模式实战
  • NLP 文本匹配任务核心梳理
  • 招联金融秋招-2025
  • Cesium 视点漫游
  • 828华为云征文 | 在华为云X实例上安装部署企业Wiki知识分享平台的实践
  • IM项目中即时消息管理的技术实现及优劣分析
  • [leetcode刷题]面试经典150题之7同构字符串(简单)
  • 数据库 - MySQL数据查询
  • 智能仓库|基于springBoot的智能无人仓库管理设计与实现(附项目源码+论文+数据库)