У меня есть список, testList
который содержит кучу строк. Я хотел бы добавить новую строку в testList
единственную, если она еще не существует в списке. Поэтому мне нужно выполнить поиск в списке без учета регистра и сделать его эффективным. Я не могу использовать, Contains
потому что это не принимает во внимание корпус. Я также не хочу использовать ToUpper/ToLower
по причинам производительности. Я сталкивался с этим методом, который работает:
if(testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
Это работает, но также соответствует частичным словам. Если список содержит «козел», я не могу добавить «овес», потому что он утверждает, что «овес» уже есть в списке. Есть ли способ эффективно искать списки без учета регистра, где слова должны точно совпадать? Спасибо
источник
List<>.Exists(Predicate<>)
метод экземпляра. Также обратите внимание, что если список содержитnull
записи, это может взорвать. В этом случае это более безопасно,keyword.Equals(x, StringComparison.OrdinalIgnoreCase)
чем сказатьx.Equals(keyword, StringComparison.OrdinalIgnoreCase)
(если вы можете гарантировать, чтоkeyword
никогда не будет нулевым).Я понимаю, что это старый пост, но на всякий случай, если кто-то еще ищет, вы можете использовать
Contains
его, предоставив компаратор равенства строк без учета регистра следующим образом:Это было доступно начиная с .net 2.0 в соответствии с MSDN .
источник
StringComparer
Класс был примерно с 2,0, но перегрузка Содержит была введена в 3.5. msdn.microsoft.com/en-us/library/bb339118(v=vs.110).aspxОсновываясь на ответе Адама Силлса выше - вот хороший чистый метод расширений для Contains ... :)
источник
Вы можете использовать StringComparer:
источник
Основано на ответе Ланса Ларсена - вот метод расширения с рекомендуемой строкой. Сравните вместо строки.
источник
Вы проверяете, является ли результат IndexOf большим или равным 0, то есть начинается ли совпадение где-либо в строке. Попробуйте проверить, равно ли оно 0:
Теперь «коза» и «овес» не будут совпадать, но «коза» и «козлята» будут совпадать. Чтобы избежать этого, вы можете сравнить длины двух строк.
Чтобы избежать всего этого, вы можете использовать словарь вместо списка. Их ключом будет строка нижнего регистра, а значением будет настоящая строка. Таким образом, производительность не пострадает, потому что вам не нужно использовать
ToLower
для каждого сравнения, но вы все равно можете использоватьContains
.источник
Ниже приведен пример поиска ключевого слова во всем списке и удаления этого элемента:
Если вы хотите удалить книгу, содержащую ключевое слово в свойстве Text, вы можете создать список ключевых слов и удалить его из списка книг:
источник
У меня была похожая проблема, мне нужен был индекс элемента, но он должен был быть без учета регистра, я просматривал сеть в течение нескольких минут и ничего не нашел, поэтому я просто написал небольшой метод, чтобы сделать это, вот что я сделал:
Добавьте этот код в тот же файл и назовите его так:
Надеюсь это поможет. Удачи!
источник