Tengo una lista testList
que contiene un montón de cadenas. Me gustaría agregar una nueva cadena a la testList
única si aún no existe en la lista. Por lo tanto, necesito hacer una búsqueda de mayúsculas y minúsculas en la lista y hacerla eficiente. No puedo usar Contains
porque eso no tiene en cuenta la carcasa. Tampoco quiero usar ToUpper/ToLower
por razones de rendimiento. Encontré 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 distinción de mayúsculas y minúsculas, donde las palabras tienen que coincidir exactamente? Gracias
fuente
List<>.Exists(Predicate<>)
método de instancia. También tenga en cuenta que si la lista contienenull
entradas, esto puede explotar. En ese caso, es más seguro decirkeyword.Equals(x, StringComparison.OrdinalIgnoreCase)
quex.Equals(keyword, StringComparison.OrdinalIgnoreCase)
(si puede garantizar quekeyword
nunca sea nulo).Me doy cuenta de que esta es una publicación antigua, pero en caso de que alguien más esté mirando, puede usar
Contains
proporcionando el comparador de igualdad de cadena que no distingue entre mayúsculas y minúsculas de la siguiente manera:Esto ha estado disponible desde .net 2.0 de acuerdo con msdn .
fuente
StringComparer
clase ha existido desde 2.0, pero esa sobrecarga de Contains se introdujo en 3.5. msdn.microsoft.com/en-us/library/bb339118(v=vs.110).aspxBasado en la respuesta anterior de Adam Sills: aquí hay un buen método de extensiones limpias para Contiene ... :)
fuente
Puedes usar StringComparer:
fuente
Basado en la respuesta de Lance Larsen: aquí hay un método de extensión con la cadena recomendada. Comparar en lugar de cadena.
fuente
Está comprobando si el resultado de IndexOf es mayor o igual a 0, lo que significa si la coincidencia comienza en algún lugar de la cadena. Intenta comprobar si es igual a 0:
Ahora "cabra" y "avena" no coincidirán, pero "cabra" y "cabra" sí. Para evitar esto, puede comparar las longitudes de las dos cadenas.
Para evitar toda esta complicación, puede usar un diccionario en lugar de una lista. La clave sería la cadena en minúsculas, y el valor sería la cadena real. De esta manera, el rendimiento no se ve afectado porque no tiene que usarlo
ToLower
para cada comparación, pero aún puede usarloContains
.fuente
A continuación se muestra el ejemplo de búsqueda de una palabra clave en toda la lista y eliminar ese elemento:
Si desea eliminar un libro que contiene alguna palabra clave en la propiedad Texto, puede crear una lista de palabras clave y eliminarla de la lista de libros:
fuente
Tuve un problema similar, necesitaba el índice del elemento, pero no debía distinguir entre mayúsculas y minúsculas, busqué en la web durante unos minutos y no encontré nada, así que escribí un pequeño método para hacerlo, esto es lo que hice. hizo:
Agregue este código al mismo archivo y llámelo así:
Espero que esto ayude, buena suerte!
fuente