> 백엔드 개발 > C++ > C#에서 영숫자 문자열을 올바르게 정렬하는 방법은 무엇입니까?

C#에서 영숫자 문자열을 올바르게 정렬하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-02 19:02:38
원래의
777명이 탐색했습니다.

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);
}
로그인 후 복사

이 코드는 문자열 배열을 정렬하는 것을 목표로 합니다. 숫자적으로, 但得到的输 Out却是不正确的:

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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿