Как игнорировать случай при сравнении строки?
Я использую linq для поиска по списку (пользователь вводит запрос в текстовое поле).
Я хочу, чтобы это было нечувствительным к регистру и пыталось использовать IgnoreCase, но я понятия не имею, куда его поместить.... Я знаю, что могу использовать верхний или нижний, но я хотел бы услышать, есть ли у кого-нибудь альтернатива методы? Что считается лучшей практикой?
Regex, похоже, тоже не работает?
string searchQuery = tbSearchQuery.Text;
var something= from x in y
where x.Subject.Contains(searchQuery)
select x;
Ответы
Ответ 1
Используйте string.Compare:
var something= from x in y
where string.Compare(x.Subject, searchQuery, true) >= 0
select x;
Это также может обрабатывать ситуации, когда строки имеют значение null.
Ответ 2
Поскольку никто еще не поставил его, я бы предложил использовать статический String.Equals, поэтому вам не нужно беспокоиться о null
и верните только ту информацию, которую вы хотите.
String.Compare также работает, но вы не пытаетесь сортировать строки (причина для целочисленного возвращаемого значения), просто определите, они равны по стоимости при нечувствительном к регистру сравнении.
var something = from x in y
where string.Equals(x.Subject, searchQuery, StringComparison.CurrentCultureIgnoreCase)
select x;
Ответ 3
string searchQuery = tbSearchQuery.Text;
var something= from x in y
where x.Subject.IndexOf(searchQuery, StringComparison.OrdinalIgnoreCase) >= 0
select x;
Ответ 4
Я использую следующие собственные сделанные расширения (для простых строк)
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
public static bool ContainsIgnoreCase(this string source, string toCheck)
{
return source.IndexOf(toCheck, StringComparison.InvariantCultureIgnoreCase) >= 0;
}
НТН
Ответ 5
Try
string searchQuery = tbSearchQuery.Text;
var something= from x in y
where x.Subject.IndexOf(searchQuery, StringComparison.OrdinalIgnoreCase) != -1
Ответ 6
Не могли бы вы использовать IndexOf
?
string searchQuery = tbSearchQuery.Text;
var something= from x in y
where x.Subject.IndexOf(searchQuery, StringComparison.OrdinalIgnoreCase) >= 0
select x;
Ответ 7
Если вы используете LINQ-to-SQL
или Entity Framework
, правила сортировки фиксированы и заданы в определении таблицы. Единственный способ их сравнения - ToUpper
(или ToLower
, но лучше ToUpper
, как написано здесь http://www.siao2.com/2007/10/01/5218976.aspx) обе части сравнения.
Ответ 8
Я второй способ расширения. У меня есть класс, который я использую. Просто проложите это в своем проекте и обратитесь к ПРОГРАММЕ YOUR NAME, и вы уходите.
using System;
namespace YOUR NAME SPACE
{
public static class StringExtensionMethods
{
/// <summary>
/// Extention method to allow a string comparison where you can supply the comparison type
/// (i.e. ignore case, etc).
/// </summary>
/// <param name="value">The compare string.</param>
/// <param name="comparisionType">The comparison type - enum, use OrdinalIgnoreCase to ignore case.</param>
/// <returns>Returns true if the string is present within the original string. </returns>
public static bool Contains(this string original, string value, StringComparison comparisionType)
{
return original.IndexOf(value, comparisionType) >= 0;
}
}
}
И вот пример использования запроса LINQ:
var results = from promotion in response
where
String.IsNullOrEmpty(find.Code) ||
(promotion.Code != null && promotion.Code.Contains(find.Code, StringComparison.OrdinalIgnoreCase))
where
String.IsNullOrEmpty(find.Name) ||
(promotion.Name != null && promotion.Name.Contains(find.Name, StringComparison.OrdinalIgnoreCase))
select promotion;