Búsqueda de lista que no distingue entre mayúsculas y minúsculas

Resuelto Brap asked hace 13 años • 8 respuestas

Tengo una lista testListque contiene un montón de cadenas. Me gustaría agregar una nueva cadena testListsolo 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 Containsporque eso no tiene en cuenta la carcasa. Tampoco quiero usarlo ToUpper/ToLowerpor 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

Brap avatar Oct 16 '10 07:10 Brap
Aceptado

Me doy cuenta de que esta es una publicación antigua, pero en caso de que alguien más esté mirando, puede usarla proporcionando Containsel 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 .

shaxby avatar Mar 15 '2013 16:03 shaxby

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");
Adam Sills avatar Oct 16 '2010 00:10 Adam Sills

Puedes usar StringComparervariantes estáticas con la Containssobrecarga 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");
}
jlo-gmail avatar Feb 26 '2019 15:02 jlo-gmail