본문 바로가기
C#

C#] String 검색 함수, 성능 비교

by Fastlane 2023. 10. 23.
728x90
반응형

출처 : How to Perform Case-Insensitive Substring Search in C# (code-maze.com)

1. String.Contains()

2가지 overloads가 있다. Contains(String), Contains(String, StringComparison)

StringComparision은 6개의 enum 값을 갖는다. 여기서는 2개만 살펴보자. 

Ordinal enumeration : enum 미지정 시, 기본으로 설정되는 enum, 소문자와 대문자를 구분한다. 

var sourceString = "Hello World";
var substringToSearch = "world";

sourceString.Contains(substringToSearch, StringComparison.OrdinalIgnoreCase); // true

 

2. String.ToUpperInvariant()

original string과 substring을 모두 대문자로 바꾼 뒤 비교한다. 

var sourceString = "Hello World"; 
var substringToSearch = "world"; 

sourceString.ToUpperInvariant().Contains(substringToSearch.ToUpperInvariant()); // true

 

3. String.IndexOf()

IndexOf()는 6 overloads를 제공한다. 

case-insensitive substring 검색을 위해서는 IndexOf(String, StringComparison) overload를 사용한다. 

var sourceString = "Hello World";
var substringToSearch = "world";

sourceString.IndexOf(substringToSearch, StringComparison.OrdinalIgnoreCase); // 6

source string에서 substring의 시작 index를 반환한다. substring이 없으면 -1을 반환한다. 

 

4. Regular Expressions

Regex.IsMatch() 여러 overloads를 제공하며, 여기서는 InMatch(String, String, RegexOptions)를 사용하자. 

RegexOptions는 11개의 다른 enums를 갖는다. 자주 사용하는 것으로 IgnoreCase, CultureInvariant, IgnorePatternWhitespace가 있다. option을 지정하지 않으면 RegexOptions은 기본으로 None이 된다. 

 

var sourceString = "Hello World";
var substringToSearch = "world";

Regex.IsMatch(sourceString, substringToSearch, RegexOptions.IgnoreCase); // true

 

5. LINQ, String.Equals()

var sourceString = "Hello World";
var substringToSearch = "world";
var separator = ' ';

sourceString
    .Split(separator)
    .Any(word => word.Equals(substringToSearch, StringComparison.OrdinalIgnoreCase)); // true

 

6. 성능 비교

benchmark로 성능을 비교해보자. 

Source String : "A quick brown fox jumps over the lazy dog. The lazy dog barks loudly. The brown fox runs away quickly"

Substring : "loudly"

 

|                      Method |         Mean |      Error |      StdDev |       Median | Allocated |
|---------------------------- |-------------:|-----------:|------------:|-------------:|----------:|
|               StringIndexOf |     32.69 ns |   0.664 ns |    1.034 ns |     32.32 ns |         - |
|              StringContains |     33.12 ns |   0.681 ns |    1.020 ns |     33.03 ns |         - |
|      StringToUpperInvariant |     96.27 ns |   1.949 ns |    4.996 ns |     94.58 ns |     272 B |
|                RegexIsMatch |    163.24 ns |   1.585 ns |    1.405 ns |    163.02 ns |         - |
|            LinqStringEquals |    452.85 ns |   8.183 ns |    7.254 ns |    452.51 ns |     952 B |

String.IndexOf()와 String.Contains()가 비슷한 속도로 가장 빠르다. 

728x90
반응형

댓글