Как игнорировать случай при сравнении строки?

Я использую 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;