Как игнорировать чувствительность к регистру в 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));
Как я могу игнорировать регистр букв в поиске Содержит?
Спасибо,
Ответы
Ответ 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 строковых параметра и сравнивает их