본문 바로가기
C#

[C#] StringComparer

by DANEW 2023. 10. 6.

StringComparer 클래스

 

StringComparer 클래스 (System)

특정 대/소문자 및 문화권 기반 또는 서수 비교 규칙을 사용하는 문자열 비교 연산을 나타냅니다.

learn.microsoft.com

namespace System
{
    public abstract class StringComparer : IComparer, IEqualityComparer, IComparer<string>, IEqualityComparer<string>
    {
        protected StringComparer();
 
        public static StringComparer InvariantCulture { get; }
        public static StringComparer InvariantCultureIgnoreCase { get; }
        public static StringComparer CurrentCulture { get; }
        public static StringComparer CurrentCultureIgnoreCase { get; }.
        public static StringComparer Ordinal { get; }
        public static StringComparer OrdinalIgnoreCase { get; }
        public static StringComparer Create(CultureInfo culture, bool ignoreCase);
 
        public int Compare(object x, object y);
        public abstract int Compare(string x, string y);
        public bool Equals(object x, object y);
        public abstract bool Equals(string x, string y);
        public int GetHashCode(object obj);
        public abstract int GetHashCode(string obj);
    }
}

- StringComparer는 추상 클래스, 직접 인스턴스화 할 수는 없음
- 적절한 인스턴스를 돌려주는 정적 메서드와 속성들이 존재

반응형
using System;
using System.Collections.Generic;
using System.Globalization;
 
namespace Practice
{
    class Program
    {
        public static void Main(string[] arg)
        {
            // 대소문자를 구분하지 않는 순서 있는 사전
            var dic = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
 
            // 호주식 영어를 이용해서 목록을 정렬
            string[] names = { "Tom", "HARRY", "sheila" };
            CultureInfo ci = new CultureInfo("en-AU"); ;
            Array.Sort(names, StringComparer.Create(ci, false));
 
            foreach (var item in names)
            {
                Console.WriteLine(item);
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Globalization;
 
namespace Practice
{
    class Program
    {
        public static void Main(string[] arg)
        {
            var dic = new SortedDictionary<string, int>(new SurnameComparer(new CultureInfo("en-US")));
 
            dic.Add("MacPhail", 2);
            dic.Add("MacWilliam", 3);
            dic.Add("McDonald", 1);
 
            foreach (var item in dic)
            {
                Console.WriteLine($"{item.Key}: {item.Value}");
            }
        }
 
        class SurnameComparer : Comparer<string>
        {
            StringComparer strCmp;
 
            public SurnameComparer(CultureInfo ci)
            {
                // 대소문자를 구분하지 않고 문화권을 감지하는 문자열 비교자
                strCmp = StringComparer.Create(ci, false);
            }
 
            string Normalize(string str)
            {
                str = str.Trim();
 
                if (str.ToUpper().StartsWith("MC"))
                {
                    str = "MAC" + str.Substring(2);
                }
 
                return str;
            }
 
            public override int Compare(string x, string y)
            {
                // 문화권 감지 StringComparer의 Compare를 직접 호출
                return strCmp.Compare(Normalize(x), Normalize(y));
            }
        }
    }
}

 

반응형