Comprobar si una cadena contiene un elemento de una lista (de cadenas)
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?
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, HashSet
etc., 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.BinarySearch
para 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);
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))