Neste artigo vou falar um pouco de como trabalhar com Case-Insensitive em Listas, como havia combinado no artigo anterior.
Antes de falar de lista gostaria de falar de um tipo de Hashtable (eu sei que Hashtable foi assunto do outro post, porém existe uma armadilha do .NET
)
Conforme apresentei anteriormente, a classe usada para criar Hashtable Case-Insensitive é CollectionsUtil, com o método CollectionsUtil.CreateCaseInsensitiveHashtable(). O outro método utilitário desta classe é CollectionsUtil.CreateCaseInsensitiveSortedList(). Então ele é o usado para lista case insensitive ?? Não, ele é usado para criar um SortedList que na verdade é um Hashtable e que ordena as entradas pelo valor das chaves :S Estranho, não!? Esse nome realmente não é sugestivo, pois não se trata de uma lista ordenada, mas SortedList é assunto para outro post, vamos ao que interessa!
Pra começar é interessante notar que Case-Insensitive é um problema natural de dicionários, e não de listas, e deve ser por isso que não existe um lista nativa em .NET que seja Case-Insensitive.
Então por que estou escrevendo este post ? Pra mostar uma forma de se fazer busca Case-Insensitive em um ArrayList.
Busca Case-Insensitive em ArrayList.
Isto é, buscar uma string em uma lista sem considerar o case.
Vamos criar um método estático que recebe um ArrayList, um string para ser buscada e então retorna true se a string existir e false se não existir, considerando a comparação Case-Insensitive:
public static bool ContemValor(string valor, ArrayList lista)
{
ArrayList aux = new ArrayList(lista);
aux.Sort();
return (aux.BinarySearch(valor, StringComparer.InvariantCultureIgnoreCase) >= 0);
}
Outra opção é estender a classe ArrayList e sobrescrever o método Contains, segue a implmentacão:
public class ListaCaseInsensitive : ArrayList
{
public override bool Contains(object item)
{
ArrayList aux = new ArrayList(lista);
aux.Sort();
return (aux.BinarySearch(valor, StringComparer.InvariantCultureIgnoreCase) >= 0);
}
}
Para a inserção essa operação não faz sentido pois se fossémos verificar se um valor, case-insensitive ou não, existe em uma lista antes de inserí-lo na mesma essa lista passaria a ser um tipo de Conjunto, o qual, diferentemente de uma lista, não possui elementos repetidos.
É isso, como podem ver a implementação é bastante enxuta, porém pode causar dúvidas por não ser uma operação nativa de ArrayList ou qualquer outro tipo de lista em .NET 2.0. Essa foi a melhor forma que encontrei de satisfazer esse requisito, caso conheça alguma outra compartilhe conosco!
Espero ter colaborado, se esse assunto te interessou faça um comentário!