2009-11-04 21 views
5

我目前有一個名爲regkey和一個名爲line_to_delete的字符串,我顯然想從列表中刪除。此刻,我在創建子字符串時一次搜索列表中的一個元素,因爲line_to_delete僅表示要刪除的行的一部分,但在列表中可唯一標識。更快的方式來搜索一個C#列表<String>的子串

無論如何,我真的需要做的是讓這個更高效,使用更少的資源,更快,所以有什麼辦法可以做到這一點?

回答

6

使用蘭巴表達式,如果它是一個List<string>

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

這仍然會有O(n)性能 – mfeingold 2009-11-04 16:20:27

+0

是的,但由於OP在子串上匹配,我不認爲SortedList會有所幫助。 – 2009-11-04 16:22:20

+0

確實如此,但是您擁有二叉樹,您可以在現有樹上自己執行二分搜索。我們不是這麼困難,你會以這種方式得到O(log(n)) – mfeingold 2009-11-04 16:28:04

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); 

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

這會讓你刪除的可讀性,但我不知道在與目前的方法相比的性能。

2

最簡單的方法是使用:

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

首先,確認這是不是足夠有效的。如果不是,則需要使用高級數據結構來表示字符串,例如trie。在C#中沒有任何這種東西的本地支持。

3

最好的辦法是對列表進行排序,並使用二進制搜索。排序列表會爲你..這樣你就可以得到O(日誌(n))的性能

+0

列表也有一個BinarySearch方法:http://msdn.microsoft.com/en-us/library/3f90y839.aspx – Powerlord 2009-11-04 16:21:55

+0

不,這不因爲OP正在搜索匹配的子字符串。 – 2009-11-04 16:43:29

+1

排序清單的成本是多少? – 2009-11-04 17:11:48

2

我覺得這是更好地的indexOf而不是包含使用,也加快了搜索

所以使用這樣做:

regkey.RemoveAll(k => k.IndexOf(line_to_delete) >=0); 
相關問題