2010-02-11 8 views
4

와일드 카드 용 공간을 사용하여 두 문자열을 비교하는 가장 빠른 방법이이 함수보다 있습니까?C# - 와일드 카드를 사용하여 두 문자열을 비교하는 가장 빠른 방법

public static bool CustomCompare(this string word, string mask) 
{ 

    for (int index = 0; index < mask.Length; index++) 
    { 
     if (mask[index] != ' ') && (mask[index]!= word[index])) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

예 : "문장"과 비교하는 문장이 참을 반환합니다. (비교되는 두 개의 길이가 같아야합니다.)

+0

따라서 파일 시스템 * 와일드 카드와 같이 가변 폭 와일드 카드가 필요하지 않습니까? –

+0

현재이 함수와 같은 길이의 문자열을 비교하기 때문에 현재로서는 그럴 필요가 없습니다. – Gregoire

답변

2

루프가 매우 간단하고 훨씬 더 잘할 수 있을지 확신하지 못합니다. if 문에서 표현식의 순서를 미세하게 최적화 할 수 있습니다. 예를 들어 인해 & &의 단락으로는 if 문에게 문자와 일치하는 와일드 카드와 일치하는 것이 더 일반적이라고 가정하면이 방법

if (mask[index]!= word[index])) && (mask[index] != ' ') 

주문 빠를 수 있습니다. 물론 이것은 이것이 단지 벤치마킹하지 않고서는 효과가 없다고 생각하는 이론 일뿐입니다.

마스크와 문자열이 같은 길이가 아니면 루틴이 실패합니다.

+0

답장을 보내 주셔서 감사합니다. 현재 와일드 카드 나 캐릭터를 가질 확률이 같습니다. – Gregoire

1

대신 .을 사용하면 간단한 정규식 일치를 수행 할 수 있습니다.

+0

어떻게 더 빨라지겠습니까? –

+1

정규식이 가장 느릴 수 있습니다. –

+2

정규식 엔진은 이보다 약간 더 최적화 될 가능성이 있습니다. 또한 자신이 작성하는 코드가 적어 실제 플러스입니다. 어떤 "최적화"와 마찬가지로 벤치마킹해야하지만 벤치마킹 할 가치가없는 경우 성능 차이는 중요하지 않습니다. –

2

꽤 좋은 구현처럼 보입니다. 나는 그보다 훨씬 빨리 빠질 것이라고 생각하지 않습니다.

이 코드를 프로파일 링하여 응용 프로그램에서 병목 현상을 발견 했습니까? 나는 이것이 대부분의 목적을 위해 잘되어야한다고 생각한다.

+0

답장을 보내 주셔서 감사합니다. – Gregoire

3

mask.length가 word.length보다 작 으면이 함수는 마스크 끝에서 비교를 중지합니다. 처음에 단어/마스크 길이를 비교하면이를 방지 할 수있을뿐만 아니라 명백한 불일치를 빠르게 제거 할 수 있습니다.

+1

마스크가 단어보다 길면 현재 구현에서 예외가 발생합니다. –

+0

제안 해 주셔서 감사합니다. 사실 나는 항상 같은 길이의 문자열을 비교하지만, 감사를 추가 할 것이다. 고마워. – Gregoire

0

코드에 약간의 컨텍스트를 부여하지 않으면 약간의 불의를 저지르고 있다고 생각합니다. 물론, 패턴과 동일한 길이의 문자 하나만 검색하려는 경우 그렇습니다. 괜찮습니다.

그러나이 패턴을 다른 패턴이있는 패턴 매치러의 핵심으로 사용하는 경우 이는 좋지 않은 방법입니다. 다른 알려진 방법이 있으며 그 중 가장 좋은 방법은 정확한 응용 프로그램에 따라 다릅니다. "부정확 한 패턴 일치"라는 구절은 당신이 염려하는 문구입니다.

+0

팁 주셔서 감사. 컨텍스트를 묻는 동안, 나는 십자형의 십자형 (검정색 경우의 8 % 미만)을 생성하려고 시도하고, 목록의 패턴과 일치하는 모든 단어 (특정 길이)를 얻는 제약을 적용하는 빠른 방법을 찾습니다 또는 더 많거나 적은 300000 단어. – Gregoire

1

가변 길이 비교 : 마스크 길이가 비교 텍스트 길이보다 짧거나 같다고 가정 할 때 내 응용 프로그램의 시작 위치로 코드를 사용했습니다. 마스크의 가변 길이 와일드 카드 자리를 허용합니다. 예 : "CONCAT"는 "C ncat"또는 "CT"또는 "C NC t"이 빨리하지만 깔끔한 보이는 경우

private bool CustomCompare(string word, string mask) 
    { 
     int lengthDifference = word.Length - mask.Length; 
     int wordOffset = 0; 
     for (int index = 0; index < mask.Length; index++) 
     { 
      if ((mask[index] != ' ') && (mask[index]!= word[index+wordOffset]))     
      { 
       if (lengthDifference <= 0) 
       { 
        return false; 
       } 
       else 
       { 
        lengthDifference += -1; 
        wordOffset += 1; 
       } 
      } 
     } 
     return true; 
    } 
1

확실하지의 마스크를 일치합니다 :

public static bool CustomCompare(this string word, string mask) 
{ 
    return !mask.Where((c, index) => c != word[index] && c != ' ').Any(); 
} 
관련 문제