2009-11-04 14 views
5

Mam obecnie listę o nazwie regkey i ciąg o nazwie line_to_delete, który oczywiście chcę usunąć z listy. W tej chwili przeszukuję jeden element listy na raz, tworząc ciągi jako line_to_delete reprezentuje tylko część linii, którą chcę usunąć, ale jest jednoznacznie identyfikowalna na liście.Szybciej wyszukiwać listę C# <String> dla podciągów

W każdym razie, co naprawdę muszę zrobić, to sprawić, by było to bardziej wydajne, zużywało mniej zasobów i było szybsze, więc czy są na to jakieś sposoby?

Odpowiedz

6

Zastosowanie Lamba wyrażeń czy jest to List<string>:

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

To nadal będzie mieć wydajność O (n). – mfeingold

+0

Tak, ale ponieważ OP pasuje do podciągów, nie sądzę, że SortedList pomoże. –

+0

To prawda, ale masz w sobie drzewo binarne i możesz zaimplementować swoje binarne wyszukiwanie samemu po istniejącym drzewie. To nam nie jest takie trudne, a dostaniesz O (log (n)) w ten sposób – 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); 

lub

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

Uczyni to usunięcie bardziej czytelne, ale nie jestem pewien na wydajność w porównaniu przeciwko aktualnej metody.

2

Najprostszym sposobem jest użycie:

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

Po pierwsze, upewnij się, że nie jest wystarczająco skuteczny. Jeśli tak nie jest, musisz użyć zaawansowanych struktur danych do reprezentowania ciągów znaków, takich jak trie. Nie ma natywnego wsparcia w C# dla takich rzeczy.

3

Najprościej jest, aby posortować listę i wykorzystać przeszukiwanie binarne. SortedList zrobi to za ciebie .. W ten sposób można uzyskać O (log (n)) wydajność

+0

Lista ma również metodę BinarySearch: http://msdn.microsoft.com/en-us/library/3f90y839.aspx – Powerlord

+0

Nie, to nie pomoc w ogóle, ponieważ OP szuka dopasowanych podciągów. –

+1

Co z kosztem sortowania listy? –

2

myślę, że lepiej jest użyć indexOf zamiast zawiera, który przyspiesza wyszukiwanie

więc używać:

Powiązane problemy