首页 >后端开发 >C++ >如何使用 C# 中的自定义比较器按字母顺序和数字对字符串进行排序?

如何使用 C# 中的自定义比较器按字母顺序和数字对字符串进行排序?

Barbara Streisand
Barbara Streisand原创
2025-01-02 13:13:38368浏览

How to Sort Strings Alphabetically and Numerically Using a Custom Comparer in C#?

通过自定义比较按字母顺序和数字对字符串进行排序

此问题提出了在考虑数值的同时按字母顺序对字符串数字数组进行排序的挑战。为此,必须实现自定义比较器来覆盖默认的字符串比较。

实现详细信息

下面的代码演示了如何实现此排序:

using System;
using System.Collections.Generic;
using System.Linq;

namespace StringSort
{
    class Program
    {
        static void Main(string[] args)
        {
            // Input array of string numbers
            string[] things = new string[] { "105", "101", "102", "103", "90" };

            // Sort using custom comparer
            IEnumerable<string> sortedThings = things.OrderBy(x => x, new SemiNumericComparer());

            // Print sorted array
            foreach (var thing in sortedThings)
            {
                Console.WriteLine(thing);
            }
        }

        public class SemiNumericComparer : IComparer<string>
        {
            // Check if a string is numeric
            public bool IsNumeric(string value)
            {
                return int.TryParse(value, out _);
            }

            // Compare two strings
            public int Compare(string s1, string s2)
            {
                const int S1GreaterThanS2 = 1;
                const int S2GreaterThanS1 = -1;

                // Check if both strings are numeric
                var IsNumeric1 = IsNumeric(s1);
                var IsNumeric2 = IsNumeric(s2);

                if (IsNumeric1 && IsNumeric2)
                {
                    int i1 = Convert.ToInt32(s1);
                    int i2 = Convert.ToInt32(s2);

                    return i1.CompareTo(i2);
                }

                // If one string is numeric and the other is not, consider the numeric string greater
                if (IsNumeric1)
                    return S2GreaterThanS1;
                if (IsNumeric2)
                    return S1GreaterThanS2;

                // Otherwise, perform a case-insensitive alphabetical comparison
                return string.Compare(s1, s2, true, CultureInfo.InvariantCulture);
            }
        }
    }
}

自定义比较器Logic

SemiNumericComparer 类定义字符串的比较逻辑。它首先使用 IsNumeric 方法检查两个字符串是否都是数字。如果两者都是数字,则会对它们进行数字比较。如果只有一个字符串是数字,则认为该数字字符串更大。对于非数字字符串,它执行不区分大小写的字母比较。

将此比较器与 Enumerable.OrderBy 一起使用时,字符串数字数组将首先按数字值排序,然后按字母顺序对非数字字符串排序。上面示例的输出将是:

90
101
102
103
105

以上是如何使用 C# 中的自定义比较器按字母顺序和数字对字符串进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn