首頁 > 後端開發 > C++ > 如何在 C# 中正確排序字母數字字串?

如何在 C# 中正確排序字母數字字串?

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

How to Sort Alphanumeric Strings Correctly in C#?

按字母數字順序對字串進行排序

在程式設計中,通常需要根據特定條件對資料進行排序。常見的情況是對可能包含字母和數字字元的字串進行排序。但是,天真地使用預設順序對此類字串進行排序可能不會產生所需的結果。

考慮以下程式碼片段:

string[] things = new string[] { "105", "101", "102", "103", "90" };

foreach (var thing in things.OrderBy(x => x))
{
    Console.WriteLine(thing);
}
登入後複製

此程式碼旨在按數字方式對字串陣列進行排序,但得到的輸出卻是不正確的:

101, 102, 103, 105, 90
登入後複製

預設排序不是根據數值對字串進行排序,而是將它們作為字串並按字母順序對它們進行排序,從而得到上面的輸出。

處理數字字串的自訂比較器

為了解決這個問題,我們可以定義一個自訂比較器可以處理字母和數字字串。這個想法是使用 Enumerable.OrderBy,它允許我們指定自訂比較器來控制排序行為。

以下是我們如何使用IComparer 實作自訂比較器介面:

public class SemiNumericComparer : IComparer<string>
{
    public int Compare(string s1, string s2)
    {
        const int S1GreaterThanS2 = 1;
        const int S2GreaterThanS1 = -1;

        var IsNumeric1 = IsNumeric(s1);
        var IsNumeric2 = IsNumeric(s2);

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

            if (i1 > i2)
            {
                return S1GreaterThanS2;
            }

            if (i1 < i2)
            {
                return S2GreaterThanS1;
            }

            return 0;
        }

        if (IsNumeric1)
        {
            return S2GreaterThanS1;
        }

        if (IsNumeric2)
        {
            return S1GreaterThanS2;
        }

        return string.Compare(s1, s2, true, CultureInfo.InvariantCulture);
    }

    public static bool IsNumeric(string value)
    {
        return int.TryParse(value, out _);
    }
}
登入後複製

此比較器檢查兩個字串是否都是數字並相應地對它們進行排序。如果只有一個字串是數字,則優先考慮字母字串。

要使用自訂比較器,我們可以修改程式碼如下:

foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{
    Console.WriteLine(thing);
}
登入後複製

現在,輸出將被正確排序按字母順序和數字順序:

007, 90, bob, lauren, paul
登入後複製

透過使用自訂比較器,我們可以有效地對包含數字字元的字串進行排序,而無需將它們轉換為整數,解決最初的挑戰並實現所需的排序行為。

以上是如何在 C# 中正確排序字母數字字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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