Как игнорировать чувствительность к регистру в List <string> - программирование
Подтвердить что ты не робот

Как игнорировать чувствительность к регистру в List <string>

Скажем, у меня есть этот код

string seachKeyword = "";
List<string> sl = new List<string>();
sl.Add("store");
sl.Add("State");
sl.Add("STAMP");
sl.Add("Crawl");
sl.Add("Crow");
List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword));

Как я могу игнорировать регистр букв в поиске Содержит?

Спасибо,

4b9b3361

Ответ 1

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

Для этого вы можете использовать следующее:

sl.FindAll(s => s.IndexOf(searchKeyword, StringComparison.OrdinalIgnoreCase) >= 0);

Лучше обернуть это в метод расширения, например:

public static bool Contains(this string target, string value, StringComparison comparison)
{
    return target.IndexOf(value, comparison) >= 0;
}

Итак, вы можете использовать:

sl.FindAll(s => s.Contains(searchKeyword, StringComparison.OrdinalIgnoreCase));

Ответ 2

Используйте Linq, это добавляет новый метод .Compare

using System.Linq;
using System.Collections.Generic;

List<string> MyList = new List<string>();
MyList.Add(...)
if (MyList.Contains(TestString, StringComparer.CurrentCultureIgnoreCase)) {
    //found
} 

так предположительно

using System.Linq;
...

List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword, StringComparer.CurrentCultureIgnoreCase));  

Ответ 3

ВЫ МОЖЕТЕ использовать Contains, предоставляя безразличный сопоставитель равенства строк таким образом:

if (myList.Contains(keyword, StringComparer.OrdinalIgnoreCase))
{
    Console.WriteLine("Keyword Exists");
}

Ответ 4

Оптимальным решением будет проигнорировать случай при сравнении

List<string> searchResults = sl.FindAll(s => s.IndexOf(seachKeyword, System.StringComparison.OrdinalIgnoreCase) >= 0);

Ответ 5

StringComparer.CurrentCultureIgnoreCase is a better approach instead of using indexOf.

Ответ 6

Вы можете применить небольшой трюк к этому.
Измените всю строку на тот же случай: либо верхний или нижний регистр

Список поискаРезультаты = sl.FindAll(s = > s.ToUpper(). Состояния (seachKeyword.ToUpper()));

Ответ 7

Для тех из вас, у кого возникли проблемы с поиском через СПИСОК ЛИСТОВ, я нашел решение.

В этом примере я искал список Jagged и хватал только списки, у которых первая строка соответствует аргументу.

List<List<string>> TEMPList = new List<List<string>>();

TEMPList = JaggedList.FindAll(str => str[0].ToLower().Contains(arg.ToLower()));

DoSomething(TEMPList);

Ответ 8

FindAll выполняет перечисление всего списка.

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

bool found = list.FirstOrDefault(x = > String.Equals(x, searchKeyWord, Stringcomparison.OrdinalIgnoreCase)!= null;

Ответ 9

Ниже метод выполнит поиск необходимого ключевого слова и добавит все найденные элементы в новый список и затем вернет новый список.

private List<string> serchForElement(string searchText, list<string> ListOfitems)
{            
    searchText = searchText.ToLower();
    List<string> Newlist = (from items in ListOfitems
                         where items.ToLower().Contains(searchText.ToLower())
                         select items).ToList<string>(); 

return Newlist;   }

Ответ 10

Один из возможных (может быть, не самый лучший), - это строчная строка всех строк, помещенных в sl. Затем вы вводите строчный ключ поиска.

Другим решением является другой метод, который строит 2 строковых параметра и сравнивает их