Rumah > pembangunan bahagian belakang > C++ > Bagaimana Mengisih Rentetan Mengikut Abjad dan Numerik Menggunakan Pembanding Tersuai dalam C#?

Bagaimana Mengisih Rentetan Mengikut Abjad dan Numerik Menggunakan Pembanding Tersuai dalam C#?

Barbara Streisand
Lepaskan: 2025-01-02 13:13:38
asal
380 orang telah melayarinya

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

Mengisih Rentetan Mengikut Abjad dan Numerik dengan Perbandingan Tersuai

Soalan ini memberikan cabaran dalam menyusun tatasusunan nombor rentetan mengikut abjad sambil mempertimbangkan nilai berangkanya . Untuk mencapai matlamat ini, pembanding tersuai mesti dilaksanakan untuk mengatasi perbandingan rentetan lalai.

Butiran Pelaksanaan

Kod di bawah menunjukkan cara melaksanakan pengisihan ini:

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);
            }
        }
    }
}
Salin selepas log masuk

Logik Pembanding Tersuai

The Kelas SemiNumericComparer mentakrifkan logik perbandingan untuk rentetan. Ia mula-mula menyemak sama ada kedua-dua rentetan adalah berangka menggunakan kaedah IsNumeric. Jika kedua-duanya adalah berangka, ia membandingkannya secara berangka. Jika hanya satu rentetan adalah angka, ia menganggap rentetan angka lebih besar. Untuk rentetan bukan angka, ia melakukan perbandingan abjad tidak peka huruf besar dan kecil.

Apabila menggunakan pembanding ini dengan Enumerable.OrderBy, tatasusunan nombor rentetan akan diisih dahulu mengikut nilai berangka, kemudian mengikut abjad untuk rentetan bukan angka . Output bagi contoh di atas ialah:

90
101
102
103
105
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana Mengisih Rentetan Mengikut Abjad dan Numerik Menggunakan Pembanding Tersuai dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan