c# 自定义字符串排序

news/2024/9/30 12:41:07 标签: 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.niftyadmin.cn/n/5685122.html

相关文章

精准把握项目申报时间节点

项目申报不仅是获取资金支持、推动项目落地的关键环节&#xff0c;更是一场与时间赛跑的竞赛。每个申报项目都伴随着一系列严格的时间节点&#xff0c;从项目构思、材料准备、提交申请到评审反馈&#xff0c;每一个环节都需精准把握&#xff0c;稍有疏忽便可能错失良机。 项目申…

基于Arduino的自弹尤克里里机器人

需要项目源码资料的可以私信我 基于Arduino的自弹尤克里里机器人 一、简介二、材料清单三、工具四、实现过程步骤1&#xff1a;实物图步骤2&#xff1a;3D打印部件步骤3&#xff1a;组装上半部分步骤4&#xff1a;组装下半部分步骤5&#xff1a;安装导轨步骤6&#xff1a;设置…

使用session来实现验证码发送功能

一、什么是session&#xff1f; Session由服务器创建&#xff0c;并为每一次会话分配一个Session对象。同一个浏览器发起的多次请求&#xff0c;同属于一次会话&#xff08;Session&#xff09;。首次使用到Session时&#xff0c;服务器会自动创建Session&#xff0c;并创建Co…

DC00023基于jsp+MySQL新生报到管理系统

1、项目功能演示 DC00023基于jsp新生报到管理系统java webMySQL新生管理系统 2、项目功能描述 基于jspMySQL新生报到管理系统项目分为学生、辅导员、财务处和系统管理员四个角色。 2.1 学生功能 1、系统登录 2、校园新闻、报到流程、学校简介、在线留言、校园风光、入校须知…

Xiaojie雷达之路---静态杂波滤除

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,本篇文章主要是介绍一下雷达信号处理中的静态杂波滤除,一起来看看吧!!! 前言 在雷达信号处理中有时候不需要考虑静止的物体,会将相对于雷达静止的物体进行滤除,静止目标被滤除后,会降低雷达…

【2024.9.29练习】R 格式

题目描述 题目分析 带小数点的高精度乘法。小数点在计算时忽略&#xff0c;只需在最终打印字符串的时候在合适位置四舍五入即可。对于&#xff0c;可理解为对d乘2总共n次。因此使用“单精度高精度”类型的算法足矣。 我的代码 一开始代码有错误&#xff0c;我只想到了对小数点…

Mac pnpm安装

安装pnpm的时候一定要把npm更新到最新版 不然pnpm下载不成功。 &#xff08;更新npm&#xff09;&#xff1a;sudo npm install -g npm (安装pnpm:) sudo npm install -g pnpm 检验安装是否成功&#xff1a;pnpm --version 项目内安装依赖&#xff1a;pnpm install / 运行项目&…

用C++游戏开发

引言 C被广泛使用于游戏开发中&#xff0c;这是因为它提供了高性能、灵活的内存管理&#xff0c;以及与硬件的低级别交互能力。在这篇文章中&#xff0c;我们将介绍C游戏开发的基础知识&#xff0c;包括游戏引擎的选择、基本的编程概念以及一些实践建议。 C在游戏开发中的优势…