2013-03-02 5 views
10

Я разрабатываю приложение на C# 4.5 и мне нужна функция, чтобы вернуться верно для последующего сравнения:комплекса «Содержит» сравнение строк

«ли-Леонар d/о ли» .ComplexContains («Леонардо»)

другими словами, мне нужно string.Compare(str1, str2, CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace) также проверить на «содержит!

может кто-нибудь помочь?

ответ

22

Вы можете использовать approp riate CompareInfo, а затем CompareInfo.IndexOf(string, string, CompareOptions) и проверьте результат на -1. Пример:

using System; 
using System.Globalization; 

class Program 
{ 
    static void Main() 
    { 
     var compareInfo = CultureInfo.InvariantCulture.CompareInfo; 
     var options = CompareOptions.IgnoreCase | 
      CompareOptions.IgnoreSymbols | 
      CompareOptions.IgnoreNonSpace; 

     var haystack = "bla Lé OnAr d/o bla"; 
     var needle = "leonardo"; 

     var index = compareInfo.IndexOf(haystack, needle, options); 
     Console.WriteLine(index); // 4 
    } 
} 

или в форме метода:

private static bool ComplexContains(string source, string value) 
{ 
    var index = CultureInfo.InvariantCulture.CompareInfo.IndexOf 
     (source, value, CompareOptions.IgnoreCase | 
     CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace); 
    return index != -1; 
} 
+1

+1 для сена и иглы. :) – publicgk

+0

+1 быстрый вопрос, хотя ... как хорошо EF5 превращает это в TSql? im используя LINQ здесь ... – Leonardo

+1

@ Leonardo: Я очень сомневаюсь, что он вообще справляется - я бы этого не ожидал. (В будущем, пожалуйста, дайте * важные данные, подобные этому в исходном вопросе.) –