2011-10-19 4 views
1

혼란을 피하기 위해 나는 linq에 대해 다른 것을 말하고 있습니다. 메모리의 많은 객체로 작업 중이므로 필터링해야합니다. 사용자가 많은 값을 선택할 수있는 많은 옵션이있는 화면이 있습니다.LinqToObjects의 Regex 및 Like 연산자

SQL에서 "Like"연산자와 비슷한 것을 구현해야합니다. 나는이 사이트에서 그것에 대한 게시물을 발견하고 regex를 사용하지만 결코 사용한 적이 없다. 문자열 패턴이 정확한지 알고 싶습니다. "%" "%"를 사용하면 안됩니까?

나는 startWith -endWith와 contains의 조합을 사용해야한다는 것을 읽었지만 조합 된 모든 것을 사용하는 예제는 찾지 못했다. 단지 어떻게하는지 느낀다.

내가 할이

string pattern = string.Format(".*{0}.*", criteria.SearchText); 
myList= myList.Where(x => x.Message.Like(pattern)).ToList(); 

public static bool Like(this string s, string pattern, RegexOptions options = RegexOptions.IgnoreCase) 
{ 
    return Regex.IsMatch(s, pattern, options); 
} 

같은 어떤 제안

답변

5

당신이 문자열이 포함되어 있는지 확인하려면 다른 사용자가 사용할 수 있습니다

myList = myList.Where(x => x.Message.Contains(criteria.SearchText)).ToList(); 

또는

myList = myList.Where(x => x.Message.IndexOf(criteria.SearchText) != -1).ToList(); 

(두 번째 varian 당신은 당신이 것을 사용자가 a*을 쓴다면, 그래서 그것을 탈출 Regex.Escape()을 사용해야합니다 Regex에서 사용자 정의 단어를 혼합 할 경우에는 CultureInfo)

을 지정할 수 있습니다 IndexOf에 있기 때문에 t이 좋은, 검색 텍스트는 any number of a 대신 a*입니다.

string pattern = string.Format(".*{0}.*", Regex.Escape(criteria.SearchText)); 

그러나 기록으로, 그것은 동등의 참고 : 당신이 당신의 정규식에 앵커를 넣어하지 않았기 때문에

string pattern = string.Format("{0}", Regex.Escape(criteria.SearchText)); 

, 그래서 정규식 어디서나 문자열에서 검색됩니다.

당신은 예를 들어 당신이

string pattern = string.Format("^{0}", Regex.Escape(criteria.SearchText)); 

로 시작하는 단어를 검색하거나 이해하기 시작

string pattern = string.Format("{0}$", Regex.Escape(criteria.SearchText)); 
+0

덕분에 많이 종료 할 수 있도록, 사용자 정의 단어를 고정하려면 – user9969