Comprobar si una cadena contiene un elemento de una lista (de cadenas)

Resuelto user57175 asked hace 15 años • 14 respuestas

Para el siguiente bloque de código:

For I = 0 To listOfStrings.Count - 1
    If myString.Contains(lstOfStrings.Item(I)) Then
        Return True
    End If
Next
Return False

La salida es:

Caso 1:

myString: C:\Files\myfile.doc
listOfString: C:\Files\, C:\Files2\
Result: True

Caso 2:

myString: C:\Files3\myfile.doc
listOfString: C:\Files\, C:\Files2\
Result: False

La lista (listOfStrings) puede contener varios elementos (mínimo 20) y debe compararse con miles de cadenas (como myString).

¿Existe una forma mejor (más eficiente) de escribir este código?

user57175 avatar Feb 01 '09 21:02 user57175
Aceptado

Con LINQ y usando C# (no conozco mucho VB estos días):

bool b = listOfStrings.Any(s=>myString.Contains(s));

o (más breve y más eficiente, pero posiblemente menos claro):

bool b = listOfStrings.Any(myString.Contains);

Si estuvieras probando la igualdad, valdría la pena mirarlo, HashSetetc., pero esto no ayudará con coincidencias parciales a menos que las dividas en fragmentos y agregues un orden de complejidad.


actualización: si realmente te refieres a "Comienza con", entonces puedes ordenar la lista y colocarla en una matriz; luego use Array.BinarySearchpara encontrar cada elemento; verifique mediante búsqueda para ver si coincide total o parcialmente.

Actualización: en el .Net reciente, Contiene tiene un parámetro StringComparison opcional , que se puede usar para comparaciones que no distinguen entre mayúsculas y minúsculas, por ejemplo, myString.Contains(s,StringComparison.CurrentCultureIgnoreCase);

Marc Gravell avatar Feb 01 '2009 14:02 Marc Gravell

Me gustó la respuesta de Marc, pero necesitaba que la coincidencia Contiene fuera CaSe InSenSiTiVe.

Esta fue la solución:

bool b = listOfStrings.Any(s => myString.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0))
WhoIsRich avatar May 01 '2014 16:05 WhoIsRich