2009-11-04 41 views
5

Actualmente tengo una lista llamada regkey y una cadena llamada line_to_delete, que obviamente quiero eliminar de la lista. En este momento estoy buscando a través de un elemento de la lista a la vez creando subcadenas, ya que line_to_delete solo representa parte de la línea que quiero eliminar, pero es identificable de forma única dentro de la lista.Formas más rápidas para buscar en una lista de C# <String> para las subcadenas

De todos modos, lo que realmente necesito hacer es hacerlo más eficiente, usar menos recursos y ser más rápido, ¿hay alguna forma de hacerlo?

Respuesta

6

expresiones Uso lamba si es un List<string>:

list.RemoveAll(x => x.Contains(line_to_delete)); 
+0

Esto todavía tendrá el rendimiento O (n) – mfeingold

+0

Sí, pero dado que el OP coincide en subcadenas, no creo que una SortedList sea útil. –

+0

Es verdad, pero tiene el árbol binario y puede implementar su búsqueda binaria sobre el árbol existente. No nos resulta tan difícil y obtenemos la O (log (n)) de esta manera – mfeingold

2
 List<String> regKey = new List<String> { "test1", "test2" }; 
     var toDelete = regKey.Where(u => u.Contains(line_to_delete)).SingleOrDefault(); 
     if (toDelete != null) 
      regKey.Remove(toDelete); 

o

regkey.RemoveAll(k => k.Contains(line_to_delete)); 

Esto hará que su eliminación sea más legible, pero no estoy seguro sobre el rendimiento se compara con su método actual.

2

La forma más sencilla es utilizar:

var result = list.Where(x => !x.Contains(line_to_delete)) 

En primer lugar, asegurarse de que esto no es lo suficientemente eficiente. Si no es así, debe recurrir a estructuras de datos avanzadas para representar sus cadenas, como trie. No hay soporte nativo en C# para tales cosas.

3

su mejor apuesta es para ordenar la lista y utilizar la búsqueda binaria. SortedList lo hará por usted .. De esta manera se puede obtener O ((n) log) el rendimiento

+0

La lista también tiene un método BinarySearch: http://msdn.microsoft.com/en-us/library/3f90y839.aspx – Powerlord

+0

No, eso no funciona ayuda en absoluto, ya que el OP está buscando subcadenas coincidentes. –

+1

¿Qué pasa con el costo de ordenar la lista? –

2

creo que es mejor usar indexOf más que contiene, que acelera la búsqueda

a fin de utilizar:

regkey.RemoveAll(k => k.IndexOf(line_to_delete) >=0); 
Cuestiones relacionadas