22.02.10_문자열비교-Compare()
본문 바로가기
CS Study/Csharp

22.02.10_문자열비교-Compare()

by KyeongMin 2022. 2. 10.
728x90
반응형

 

사용되는 패턴 소개

1. public static int Compare(string strA, string strB); 
2. public static int Compare(string strA, string strB, StirngComparison comparisonType);
3. public static int Compare(string strA, string strB, bool ignoreCase, CultureInfo culture); 
4. public static int Compare(string strA, string strB, CultureInfo culture, ComparisonOptions options); 
5. public static int Compare(string strA, int indexA, string strB, int indexB, int length); 
6. public static int Compare(string strA, int indexA, string strB, int indexB, int length, bool igonreCase); 
7. public static int Compare(string strA, int indexA, string strB, int intdexB, int length, StringComparison comparisonType);
8. public static int Compare(string strA, int indexA, string strB, int intdexB, int length, bool igonreCase,CultureInfo culture);
9. public static int Compare(string strA, int indexA, string strB, int intdexB, int length, CultureInfo culture, ComparisonOptions options);

strA, strB : 비교할 문자열

comparison Type : StringComparison 열거형 자료 타입의 한 멤버 유형

indexA, indexB: 각 문자열의 시작 위치

A.문자열자체를 비교

1.int Compare(string strA, string strB)

using System;

namespace StringCompare
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Apple";
            string str2 = "apple";

            Console.WriteLine($"str1과 str2를 비교한 결과는 str1이 str2보다 큰경우 {string.Compare(str1,str2)} 입니다.");
            Console.WriteLine($"str1과 str1를 비교한 결과는 같은 경우 {string.Compare(str1, str1)} 입니다.");
            Console.WriteLine($"str1과 str2를 비교한 결과는 str2이 str1보다 작은경우 {string.Compare(str2, str1)} 입니다.");

        }
    }
}

  • 즉, strA < strB 인 경우 -1 (정렬순서가 빠른경우)
    • strA == strB 인 경우 0 (정렬 순서가 동일한 경우)
    • strA > strB 인 경우 1 (정렬 순서가 느린 경우)

2.int Compare(string strA, string strB, StirngComparison comparisonType)

  • comparisonType : StringComparison : 비교에 사용할 규칙을 지정하는 열거형 값 중 하나입니다.
using System;

namespace StringCompare
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Apple";
            string str2 = "apple";

            Console.WriteLine($"CurrentCultureIgnoreCase인 경우 대소문자 무시 {string.Compare(str1,str2, StringComparison.CurrentCultureIgnoreCase)} 입니다.");
        }
    }
}

2.1 comparisonType

comparisonTypeNumber설명

CurrentCulture 0 문화권 구분 정렬 규칙 및 현재 문화권을 사용하여 문자열을 비교합니다.
CurrentCultureIgnoreCase 1 문화권 구분 정렬 규칙 및 현재 문화권을 사용하고 비교되는 문자열의 대/소문자를 무시하여 문자열을 비교합니다.
InvariantCulture 2 문화권 구분 정렬 규칙 및 고정 문화권을 사용하여 문자열을 비교합니다.
InvariantCultureIgnoreCase 3 문화권 구분 정렬 규칙 및 고정 문화권을 사용하고 비교되는 문자열의 대/소문자를 무시하여 문자열을 비교합니다.
Ordinal 4 서수(이진) 정렬 규칙을 사용하여 문자열을 비교합니다.
OrdinalIgnoreCase 4 서수(이진) 정렬 규칙을 사용하고 비교되는 문자열의 대/소문자를 무시하여 문자열을 비교합니다.

2.1.1 사용예제

using System;
using System.Globalization;
using System.Threading;

namespace StringCompare
{
    class Program
    {
        static void Main(string[] args)
        {
            String[] cultureNames = { "en-US", "se-SE" };
            String[] strings1 =
            {
                "case", "encyclopædia",
                "encyclopædia", "Archæology"
            };
            String[] strings2 =
            {
                "Case", "encyclopaedia",
                "encyclopedia", "ARCHÆOLOGY"
            };
            StringComparison[] comparisons = (StringComparison[])Enum.GetValues(typeof(StringComparison));

            foreach (var cultureName in cultureNames)
            {
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
                Console.WriteLine("Current Culture: {0}", CultureInfo.CurrentCulture.Name);
                for (int ctr = 0; ctr <= strings1.GetUpperBound(0); ctr++)
                {
                    foreach (var comparison in comparisons)
                        Console.WriteLine("   {0} = {1} ({2}): {3}", strings1[ctr],
                            strings2[ctr], comparison,
                            String.Equals(strings1[ctr], strings2[ctr], comparison));

                    Console.WriteLine();
                }

                Console.WriteLine();
            }
        }

    }
}

2.1.2 예제 결과

Current Culture: en-US
   case = Case (CurrentCulture): False
   case = Case (CurrentCultureIgnoreCase): True
   case = Case (InvariantCulture): False
   case = Case (InvariantCultureIgnoreCase): True
   case = Case (Ordinal): False
   case = Case (OrdinalIgnoreCase): True

   encyclopædia = encyclopaedia (CurrentCulture): False
   encyclopædia = encyclopaedia (CurrentCultureIgnoreCase): False
   encyclopædia = encyclopaedia (InvariantCulture): False
   encyclopædia = encyclopaedia (InvariantCultureIgnoreCase): False
   encyclopædia = encyclopaedia (Ordinal): False
   encyclopædia = encyclopaedia (OrdinalIgnoreCase): False

   encyclopædia = encyclopedia (CurrentCulture): False
   encyclopædia = encyclopedia (CurrentCultureIgnoreCase): False
   encyclopædia = encyclopedia (InvariantCulture): False
   encyclopædia = encyclopedia (InvariantCultureIgnoreCase): False
   encyclopædia = encyclopedia (Ordinal): False
   encyclopædia = encyclopedia (OrdinalIgnoreCase): False

   Archæology = ARCHÆOLOGY (CurrentCulture): False
   Archæology = ARCHÆOLOGY (CurrentCultureIgnoreCase): True
   Archæology = ARCHÆOLOGY (InvariantCulture): False
   Archæology = ARCHÆOLOGY (InvariantCultureIgnoreCase): True
   Archæology = ARCHÆOLOGY (Ordinal): False
   Archæology = ARCHÆOLOGY (OrdinalIgnoreCase): True


Current Culture: se-SE
   case = Case (CurrentCulture): False
   case = Case (CurrentCultureIgnoreCase): True
   case = Case (InvariantCulture): False
   case = Case (InvariantCultureIgnoreCase): True
   case = Case (Ordinal): False
   case = Case (OrdinalIgnoreCase): True

   encyclopædia = encyclopaedia (CurrentCulture): False
   encyclopædia = encyclopaedia (CurrentCultureIgnoreCase): False
   encyclopædia = encyclopaedia (InvariantCulture): False
   encyclopædia = encyclopaedia (InvariantCultureIgnoreCase): False
   encyclopædia = encyclopaedia (Ordinal): False
   encyclopædia = encyclopaedia (OrdinalIgnoreCase): False

   encyclopædia = encyclopedia (CurrentCulture): False
   encyclopædia = encyclopedia (CurrentCultureIgnoreCase): False
   encyclopædia = encyclopedia (InvariantCulture): False
   encyclopædia = encyclopedia (InvariantCultureIgnoreCase): False
   encyclopædia = encyclopedia (Ordinal): False
   encyclopædia = encyclopedia (OrdinalIgnoreCase): False

   Archæology = ARCHÆOLOGY (CurrentCulture): False
   Archæology = ARCHÆOLOGY (CurrentCultureIgnoreCase): True
   Archæology = ARCHÆOLOGY (InvariantCulture): False
   Archæology = ARCHÆOLOGY (InvariantCultureIgnoreCase): True
   Archæology = ARCHÆOLOGY (Ordinal): False
   Archæology = ARCHÆOLOGY (OrdinalIgnoreCase): True

3.public static int Compare(string strA, string strB, bool ignoreCase, CultureInfo culture)

  • ignoreCase :Boolean : 비교 시 대/소문자를 무시하려면 true이고, 그러지 않으면 false입니다.
  • culture : CultureInfo :문화권별 비교 정보를 제공하는 개체입니다.
using System;
using System.Globalization;

namespace StringCompare
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Apple";
            string str2 = "apple";

            Console.WriteLine($"str1과 str2를 비교시 대문자 소문자 비교안함 {string.Compare(str1, str2,true, new CultureInfo("en-US"))} 입니다.");
            Console.WriteLine($"str1과 str2를 비교시 대문자 소문자 비교함 {string.Compare(str1, str2, false, new CultureInfo("en-US"))} 입니다.");
        }
    }
}

4.int Compare(string strA, string strB, CultureInfo culture, ComparisonOptions options)

  • culture: CultureInfo :문화권별 비교 정보를 제공하는 문화권입니다.
  • options : CompareOptions :대/소문자 또는 기호 무시 여부와 같이 비교를 수행할 때 사용할 옵션입니다.

4.1 CompareOptions

IgnoreCase1이 문자열 비교 옵션은 대/소문자를 무시함을 나타냅니다.

IgnoreKanaType                                                                                                          8 이 문자열 비교 옵션은 일본어 가나 형식을 무시함을 나타냅니다. 가나 형식은 일본어의 발성음을 표현하는 히라가나 문자와 가타카나 문자를 나타냅니다. 히라가나는 일본 고유의 어구과 단어를 표현하는 데 사용되고, 가타카나는 "컴퓨터"나 "인터넷" 등과 같은 외래어를 표현하는 데 사용됩니다. 발성음은 히라가나와 가타카나 모두로 표현할 수 있습니다. 이 값이 선택되어 있으면 하나의 발성음에 대해 히라가나 문자와 가타카나 문자가 같은 것으로 간주됩니다.
IgnoreNonSpace 2 분음 부호와 같이 공백 없는 조합 문자를 무시하는 문자열 비교를 나타냅니다. 유니코드 표준(Unicode Standard)에서 조합 문자는 기본 문자와 조합하여 새 문자를 만들어내는 문자로 정의됩니다. 간격이 없는 조합 문자는 렌더링될 때 스스로 공간을 차지하지 않습니다.
IgnoreSymbols 4 이 문자열 비교 옵션은 공백 문자, 문장 부호, 통화 기호, 백분율 기호, 수학 기호, 앰퍼샌드 등의 기호를 무시함을 나타냅니다.
IgnoreWidth 16 이 문자열 비교 옵션은 문자 너비를 무시함을 나타냅니다. 예를 들어 일본어의 가타카나 문자는 전자나 반자로 쓸 수 있는데, 이 값이 선택되어 있으면 전자로 쓰여진 가타카나 문자와 반자로 쓰여진 가타카나 문자가 같은 것으로 간주됩니다.
None 0 문자열 비교를 위한 기본 옵션 설정을 나타냅니다.
Ordinal 1073741824                                                                             문자열 비교가 문자열의 후속 유니코드 UTF-16 인코딩 값을 사용해야 함을 나타냅니다(코드 단위별 코드 단위 비교). 이 값을 사용하면 문자열을 빠르게 비교할 수 있지만 문화권을 구분할 수는 없습니다. XXXX16이 YYYY16보다 작은 경우 코드 단위 XXXX16으로 시작하는 문자열이 YYYY16으로 시작하는 문자열 앞에 옵니다. 이 값은 다른 CompareOptions 값과 함께 사용할 수 없으며 단독으로 사용해야 합니다.
OrdinalIgnoreCase 268435456 문자열 비교에서는 대/소문자를 무시하고 서수 비교를 수행해야 합니다. 이 기술은 고정 문화권을 사용하여 문자열을 대문자로 변환한 다음 해당 결과에 대해 서수 비교를 수행하는 것과 같습니다.
StringSort 536870912 이 문자열 비교 옵션은 문자열 정렬 알고리즘을 사용해야 함을 나타냅니다. 문자열 정렬에서 하이픈, 아포스트로피, 비영숫자 기호 등이 영숫자 문자 앞에 옵니다.

B.문자열안의 문자열을 비교

5.int Compare(string strA, int indexA, string strB, int indexB, int length)

  • 부분 문자열을 비교함
  • indexA : strA에 있는 부분 문자열의 위치입니다.
  • indexB : strB에 있는 부분 문자열의 위치입니다.
  • length : 비교할 부분 문자열의 최대 문자 수입니다.
using System;
using System.Globalization;

namespace StringCompare
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "machine";
            string str2 = "device";

            Console.WriteLine();
            Console.WriteLine($"str1 = '{str1}', str2 = '{str2}'");
            Console.WriteLine($"{string.Compare(str1, 2, str2, 0, 2)}");
        }
    }
}
  • indexA와 B는 각 문자열에서 시작하는 인덱스
  • length는 길이
    • 즉, str1에서는machine
      0 1 2 3 4 5 6
      • ch가 되는거 2부터 시작해서 두개
        • 2,3번 인덱스이기 때문
    • str2는device
      0 1 2 3 4 5
      • de가됨
        • 0,1번 인덱스이기때문
  • 그래서 ch 와 de를 비교하는것 그래서 예제에서는 -1이나옴 ch가 사전순으로 앞서기때문

6.int Compare(string strA, int indexA, string strB, int indexB, int length, bool igonreCase)

  • ignoreCase : 비교 시 대/소문자를 무시하려면 true이고, 그러지 않으면 false입니다.
    • 5번과 같지만 마지막 매게 변수에 true하면 대소문자 무시, false인 경우 무시 안함

7.int Compare(string strA, int indexA, string strB, int intdexB, int length, StringComparison comparisonType)

  • 5번에 comparisonType을 추가한것 옵션은 2.1 comparisonType참고

8.int Compare(string strA, int indexA, string strB, int intdexB, int length, bool igonreCase,CultureInfo culture)

  • ignoreCase 와 culture
  • CultureInfo : 문화권별 비교 정보를 제공하는 개체를 포함시키는 경우

9.int Compare(string strA, int indexA, string strB, int intdexB, int length, CultureInfo culture, ComparisonOptions options)

  • CultureInfo : 문화권별 비교 정보를 제공하는 개체를 포함시키는 경우
  • options : CompareOptions :대/소문자 또는 기호 무시 여부와 같이 비교를 수행할 때 사용할 옵션입니다.
    • 4.1 CompareOptions에서 옵션 확인

https://github.com/3DPIT/study/blob/master/02.studyData/05.Csharp/2022/02/0210/22.02.10_%EB%AC%B8%EC%9E%90%EC%97%B4%EB%B9%84%EA%B5%90-Compare().md 

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

'CS Study > Csharp' 카테고리의 다른 글

22.02.26_3.데이터형식과클래스  (0) 2022.02.27
22.02.17_스레드와태스크  (0) 2022.02.20
22.02.07_Csharp람다식  (0) 2022.02.07
22.02.06_Csharp대리자와이벤트  (0) 2022.02.06
22.02.06_Csharp예외처리하기  (0) 2022.02.06

댓글