2015-09-28 2 views
1

Мне нужно получить все результаты, в которых текст содержит определенное слово, игнорируя все акценты.Linq Содержит без учета акцентов

Теперь у меня есть следующие:

filtered = result.Where(p => [email protected]().ToUpper().Contains(word)); 

Или упрощенный вариант:

filtered = result.ToUpper().Contains(word)); 

Как я могу сделать "Содержит" заявление игнорировать акценты?

Заранее спасибо

+1

Как акцент, представленная в 'слово' значения? – Andrei

+1

http://stackoverflow.com/questions/444798/case-insensitive-containsstring –

+0

Просьба указать аромат Linq, который вы используете в своем вопросе. – Aron

ответ

6

Заимствование подобной формы решения here:

string[] result = {"hello there", "héllo there","goodbye"}; 

string word = "héllo"; 

var compareInfo = CultureInfo.InvariantCulture.CompareInfo; 

var filtered = result.Where(
     p => compareInfo.IndexOf(p, word, CompareOptions.IgnoreNonSpace) > -1); 
+0

Он отлично работает! Благодарю. – Ingrid

+0

Самый простой способ - изменить сортировку столбца, который вы используете, на тот, который соответствует данным. Таким образом, вам не нужно ничего делать в коде.Это команда sql для этого: ALTER TABLE table_name_here ALTER COLUMN clumn_name_here [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AI –

+0

@SterlingDiaz Правда, это было бы просто, но может иметь драматические побочные эффекты вне сферы действия вопроса. Поиски, сортировка и другие сравнения могут быть негативно затронуты. –

0

Вы хотите использовать StringComparison.InvariantCultureIgnoreCase ENUM.

Источник https://msdn.microsoft.com/en-us/library/system.stringcomparison(v=vs.110).aspx

filtered = result.Contains(word, StringComparison.InvariantCultureIgnoreCase); 

Однако это будет работать только с LinqToObject. Если вы используете LinqToSQL или LinqToEntityFramework или LinqToNHibernate, это не сработает.

+0

Случай с буквой вообще не называется «акценты» - нет опции «StringComparison», позволяющей игнорировать акценты (предполагая, что OP на самом деле это интересно) –

+0

@AlexeiLevenkov Пожалуйста, ознакомьтесь с приведенной ссылкой. Я хотел бы использовать часть InvariantCulture для перечисления. Вы также должны посмотреть [различные различные сравнения, которые показаны здесь] (https://msdn.microsoft.com/en-us/library/t4411bks (v = vs.110) .aspx). – Aron

+0

Aron, я не уверен, что вы ожидаете от InvariantCulture для сравнения - ни одно из значений этого перечисления не касается акцентов (все о правилах сортировки и случае). Кроме того, 'Contains' не принимает' StringComparison' (несмотря на все ожидания) - вы, вероятно, имеете в виду 'IndexOf' ... Образцы кода:' 'e" .IndexOf ("é", StringComparison.InvariantCultureIgnoreCase) 'и ' string. Compare («e», «é», StringComparison.InvariantCultureIgnoreCase) 'показывает, что акцентированный символ считается другим для этих операций. –

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