StringComparer 클래스
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));
}
}
}
}
반응형
'C#' 카테고리의 다른 글
[C#] WeakReference (0) | 2023.10.14 |
---|---|
[C#] GC, GCSettings, 쓰레기 수거(Garbege Collection) (0) | 2023.10.12 |
[C#] IDisposable (Dispose), 종료자(Finalizer) (0) | 2023.10.10 |
[C#] IStructuralEquatable, IStructuralComparable (0) | 2023.10.08 |
[C#] IComparer<T>, IComparer, Comparer<T> (0) | 2023.10.04 |
[C#] IEqualityComparer<T>, IEqualityComparer, EqualityComparer (0) | 2023.10.02 |
[C#] KeyedCollection<TKey,TItem>, DictionaryBase (0) | 2023.09.30 |
[C#] Collection<T>, CollectionBase, ReadOnlyCollection<T> (0) | 2023.09.28 |