首頁 > 後端開發 > C++ > 如何使用 C# 中的自訂比較器按字母順序和數字對字串進行排序?

如何使用 C# 中的自訂比較器按字母順序和數字對字串進行排序?

Barbara Streisand
發布: 2025-01-02 13:13:38
原創
368 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板