Использование содержит с функцией InvariantCultureIgnoreCase С#

Я пытаюсь заполнить все результаты, содержащие буквы, предоставленные пользователем.

foreach (var item in entries.PhonebookList.Where(ab => ab.FirstName.Contains(fName, StringComparison.InvariantCultureIgnoreCase)))
{
    Console.WriteLine("Record: {0}  {1}  {2} ", item.ItemNumber, item.FirstName, item.LastName);
}

Но я получаю сообщение об ошибке внутри метода Contains.

«Никакая перегрузка для метода «Содержит» не принимает 2 аргумента»

Как лучше всего использовать Contains с методом StringComparison.InvariantCultureIgnoreCase?

Спасибо.


person anonymousRey    schedule 13.08.2017    source источник
comment
Что такое тип fName - string?   -  person Ivan Stoev    schedule 13.08.2017
comment
Вы уверены, что хотите Contains, но Equals?   -  person George Alexandria    schedule 13.08.2017
comment
Да, мне нужно Содержит. Например, у меня есть имена Шэн и Шелдон. Когда я использую Equals и указываю ее как параметр для fName. он не будет отображать Sheng и Sheldon, поскольку он не соответствует требуемому значению.   -  person anonymousRey    schedule 13.08.2017


Ответы (2)


Согласно документации здесь вместо этого вы должны использовать string.IndexOf(string, StringComparison).

Итак, в основном это:

    var entries = new 
    {
      PhonebookList = new[]
      {
        new { ItemNumber = 1, FirstName = "Leonard", LastName = "Hofstadter" }, 
        new { ItemNumber = 2, FirstName = "Sheldon", LastName = "Cooper" }, 
        new { ItemNumber = 3, FirstName = "Howard", LastName = "Wolowitz" }, 
        new { ItemNumber = 4, FirstName = "Sheng", LastName = "?" }, 
      }
    };
    
    var fName = "she";
    foreach (var item in entries.PhonebookList.Where(ab => ab.FirstName.IndexOf(fName, StringComparison.InvariantCultureIgnoreCase) >= 0))
    {
        Console.WriteLine("Record: {0} {1} {2}", item.ItemNumber, item.FirstName, item.LastName);
    }

Что возвращает:

Рекорд: 2 Шелдон Купер

Запись: 4 Шэн ?

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

person ckuri    schedule 13.08.2017
comment
Я не получил никакой ошибки. Я получил тот же результат. если я использую ее как параметр для переменной fName. Он не показал ожидаемого результата. У меня есть Шэн и Шелдон в моем имени. - person anonymousRey; 13.08.2017
comment
Смотрите мой обновленный пример. Я полагаю, вам следует перепроверить, действительно ли ваши поля FirstName содержат имена, которые, по вашему мнению, они содержат. - person ckuri; 13.08.2017
comment
Да, я сделал. Это то, что я наблюдал. У меня есть следующие имена: Брет Диорен Кларенс Рей. Если параметр моего fName равен re. Эти имена будут отображаться. Однако, если я использую RE. Они не будут отображаться. - person anonymousRey; 13.08.2017
comment
Я проверил это на ваших новых примерах. И это работает для меня независимо от регистра условий поиска. Какой тип списка телефонной книги? Это из запроса сопоставления EntityFramework/NHibernate/ORM, т.е. типа IQueryable‹...›? Если да, вам может потребоваться изменить схему таблицы БД (см. > stackoverflow.com/questions/14400856/). - person ckuri; 13.08.2017
comment
публичный список‹PhonebookItem› PhonebookList { get; задавать; } - person anonymousRey; 13.08.2017
comment
Тогда это должно работать. Вы проверили, что ваш текст поиска не содержит пробелов? Например. если ваше fName RE равно fName.Length == 2? - person ckuri; 13.08.2017
comment
@anonymousRey По-видимому, это правильный ответ в контексте LINQ to Objects и C# в целом. Если вы утверждаете, что это не работает (хотя должно), рассмотрите возможность предоставления минимально воспроизводимого примера для подтверждения ваших утверждений, иначе я бы посчитал их неверными. - person Ivan Stoev; 13.08.2017
comment
Жалко Ккури. мой плохой на моей стороне. перед моим foreach была переменная, которая обрабатывает, если предоставленный параметр имеет соответствующий результат в моем списке. Я изменил его, и теперь он работает. Ваш ответ теперь работает для меня. Спасибо. - person anonymousRey; 13.08.2017

Вы должны использовать метод String.IndexOf вместо Contains. Если вас интересует положение значения подстроки в текущем экземпляре, вы можете вызвать метод IndexOf, чтобы получить начальную позицию его первого вхождения, или вы можете вызвать метод LastIndexOf, чтобы получить начальную позицию его последнего вхождения. Метод IndexOf(String) используется, если подстрока найдена в экземпляре строки. Также вы можете использовать другие перегрузки String.IndexOf в зависимости от ваших целей, например, с аргументами String и StringComparison.

person Media    schedule 13.08.2017