Eu tenho uma lista testList
que contém um monte de seqüências de caracteres. Eu gostaria de adicionar uma nova string testList
somente se ela ainda não existir na lista. Portanto, preciso fazer uma pesquisa sem distinção entre maiúsculas e minúsculas e torná-la eficiente. Não posso usar Contains
porque isso não leva em conta a caixa. Eu também não quero usar ToUpper/ToLower
por motivos de desempenho. Me deparei com este método, que funciona:
if(testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
Isso funciona, mas também corresponde a palavras parciais. Se a lista contiver "cabra", não será possível adicionar "aveia" porque ela afirma que "aveia" já está na lista. Existe uma maneira de pesquisar listas de maneira eficiente, sem distinção entre maiúsculas e minúsculas, onde as palavras precisam corresponder exatamente? obrigado
fonte
List<>.Exists(Predicate<>)
método de instância. Observe também que, se a lista contivernull
entradas, isso poderá explodir. Nesse caso, é mais seguro dizerkeyword.Equals(x, StringComparison.OrdinalIgnoreCase)
quex.Equals(keyword, StringComparison.OrdinalIgnoreCase)
(se você pode garantir quekeyword
nunca é nulo).Sei que este é um post antigo, mas, caso alguém esteja procurando, você pode usar
Contains
fornecendo o comparador de igualdade de cadeias sem distinção entre maiúsculas e minúsculas da seguinte maneira:Está disponível desde .net 2.0 de acordo com o msdn .
fonte
StringComparer
classe existe desde a versão 2.0, mas essa sobrecarga de Contains foi introduzida na 3.5. msdn.microsoft.com/pt-br/library/bb339118(v=vs.110).aspxBaseado na resposta de Adam Sills acima - aqui está um bom método de extensões limpas para Contains ... :)
fonte
Você pode usar StringComparer:
fonte
Com base na resposta de Lance Larsen - aqui está um método de extensão com a string recomendada. Compare em vez de string.
fonte
Você está verificando se o resultado de IndexOf é maior ou igual a 0, significando se a correspondência começa em qualquer lugar da string. Tente verificar se é igual a 0:
Agora "cabra" e "aveia" não corresponderão, mas "cabra" e "goa" corresponderão. Para evitar isso, você pode comparar os comprimentos das duas cadeias.
Para evitar toda essa complicação, você pode usar um dicionário em vez de uma lista. A chave seria a sequência minúscula e o valor seria a sequência real. Dessa forma, o desempenho não é prejudicado porque você não precisa usar
ToLower
para cada comparação, mas ainda pode usá-loContains
.fonte
Abaixo está o exemplo de pesquisa por uma palavra-chave em toda a lista e remova esse item:
Se você deseja remover um livro que contenha alguma palavra-chave na propriedade Texto, crie uma lista de palavras-chave e remova-a da lista de livros:
fonte
Eu tive um problema semelhante, precisava do índice do item, mas ele não diferenciava maiúsculas de minúsculas, procurei na web por alguns minutos e não encontrei nada, então acabei de escrever um pequeno método para fazê-lo, eis o que fez:
Adicione este código ao mesmo arquivo e chame-o assim:
Espero que isso ajude, boa sorte!
fonte