2016-05-07 4 views
0

Я пытался создать метод поиска списка, где я мог бы представить элементы в списке без изменений, и через неделю, проходя через каждый метод поиска, я мог бы найти, что понимаю, что я застрял.Как сделать регистр без учета регистра в C#?

Список (сообщения) хранят массивы, если это делает какие-либо изменения, это функция поиска я получил это далеко, что работали лучше, но это чувствительно к регистру,

string searchKey; 
    Console.WriteLine("\nEnter key: "); 
    searchKey = Console.ReadLine(); 

    foreach (string result in posts.Where(logg => logg.Contains(searchKey))) 
    { 
     Console.WriteLine("\n{0}", result); 
    } 

ли так что я надеюсь, что кто-то знает о каком-то отличном методе, который я пропустил, даже если я начну думать, что я ввернулся, и вместо этого должен пойти на другую систему.

+0

Во время игры я думаю, что нашел способ заставить его работать; (logg => logg.ToUpper(). Содержит (searchKey.ToUpper()))) –

ответ

1

Вы можете использовать IndexOf с регистронезависимомом сравнением:

var query = posts.Where(
    logg => logg.IndexOf(searchKey, StringComparison.CurrentCultureIgnoreCase) != -1); 
foreach (string result in query) 
{ 
    Console.WriteLine("\n{0}", result); 
} 

Следует отметить, что в то время как я ожидал бы, чтобы это работало на IEnumerable<T>, я подозреваю, что многие IQueryable<T> провайдеров (например, EF) вполне могут не поддерживать эти операция.

+0

О, спасибо, что один работает как шарм, я пытаюсь «StringComparison.CurrentCultureIgnoreCase» раньше, но без «запрос», поэтому я никогда не работал, спасибо за ваше время. :) –

+0

@PerlyX: тот же самый код, который был бы встроен, работал бы так же хорошо - я использовал только отдельную переменную, чтобы облегчить читаемость. –

+0

Okey, тогда, возможно, это была какая-то другая часть, которую я пропустил, я буду делать заметки из этого в будущем. –

0

Лучше сделать поиск без учета регистра, но там, где вы не один доступный, вы можете просто сделать все строки, один и тот же случай:

string lowerSearchKey = searchKey.ToLower(); 
foreach (string result in posts.Where(logg => logg.ToLower().Contains(lowerSearchKey))) 
{ 
    Console.WriteLine("\n{0}", result); 
} 

Очевидно, что это влияет на производительность, как вы звоните ToLower раз для каждого поиска, так что вы, вероятно, хотите, чтобы рассмотреть хранение всю нижнюю версию случае текст, который вы ищете:

string lowerSearchKey = searchKey.ToLower(); 
foreach (string result in posts.Where(lowerLogg => lowerLogg.Contains(lowerSearchKey))) 
{ 
    Console.WriteLine("\n{0}", result); 
} 

Это немного перебор, и может иметь последствия в некоторых культурах (например, турецкий) где преобразование между верхним и нижним регистром не совпадает с латинским алфавитом, но если у вас нет другого выбора, часто бывает, что вам нужно делать.

+0

Обнаружил, что это может сработать, чтобы немного уменьшить код, хотя это справедливая точка в сохранении более низких версий, поэтому я тоже посмотрю на это, спасибо. :) foreach (строка результата в сообщениях.Where (logg => logg.ToUpper(). Содержит (searchKey.ToUpper()))) –

+0

Обратите внимание, что это имеет некоторые странные последствия и для турецкой культуры. В общем случае использование без учета регистра поиска лучше с точки зрения правильности, чем с нижним корпусом, а затем для поиска с учетом регистра. Текст твердый :( –

+0

@JonSkeet - ах, да. Я забыл это. Я добавлю записку. – ChrisF

Смежные вопросы