Búsqueda de lista que no distingue entre mayúsculas y minúsculas
Tengo una lista testList
que contiene un montón de cadenas. Me gustaría agregar una nueva cadena testList
solo si aún no existe en la lista. Por lo tanto, necesito hacer una búsqueda en la lista que no distinga entre mayúsculas y minúsculas y hacerla eficiente. No puedo usarlo Contains
porque eso no tiene en cuenta la carcasa. Tampoco quiero usarlo ToUpper/ToLower
por razones de rendimiento. Me encontré con este método, que funciona:
if(testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
Esto funciona, pero también coincide con palabras parciales. Si la lista contiene "cabra", no puedo agregar "avena" porque dice que "avena" ya está en la lista. ¿Hay alguna manera de buscar listas de manera eficiente sin distinguir entre mayúsculas y minúsculas, donde las palabras deben coincidir exactamente? gracias
Me doy cuenta de que esta es una publicación antigua, pero en caso de que alguien más esté mirando, puede usarla proporcionando Contains
el comparador de igualdad de cadenas que no distingue entre mayúsculas y minúsculas de esta manera:
using System.Linq;
// ...
if (testList.Contains(keyword, StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine("Keyword Exists");
}
Esto ha estado disponible desde .net 2.0 según msdn .
En lugar de String.IndexOf, use String.Equals para asegurarse de no tener coincidencias parciales. Tampoco use FindAll ya que pasa por cada elemento, use FindIndex (se detiene en el primero que llega).
if(testList.FindIndex(x => x.Equals(keyword,
StringComparison.OrdinalIgnoreCase) ) != -1)
Console.WriteLine("Found in list");
Alternativamente, use algunos métodos LINQ (que también se detiene en el primero que llega)
if( testList.Any( s => s.Equals(keyword, StringComparison.OrdinalIgnoreCase) ) )
Console.WriteLine("found in list");
Puedes usar StringComparer
variantes estáticas con la Contains
sobrecarga de LINQ, por ejemplo, como esta:
using System.Linq;
var list = new List<string>();
list.Add("cat");
list.Add("dog");
list.Add("moth");
if (list.Contains("MOTH", StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine("found");
}