我目前有一個名爲regkey和一個名爲line_to_delete的字符串,我顯然想從列表中刪除。此刻,我在創建子字符串時一次搜索列表中的一個元素,因爲line_to_delete僅表示要刪除的行的一部分,但在列表中可唯一標識。更快的方式來搜索一個C#列表<String>的子串
無論如何,我真的需要做的是讓這個更高效,使用更少的資源,更快,所以有什麼辦法可以做到這一點?
我目前有一個名爲regkey和一個名爲line_to_delete的字符串,我顯然想從列表中刪除。此刻,我在創建子字符串時一次搜索列表中的一個元素,因爲line_to_delete僅表示要刪除的行的一部分,但在列表中可唯一標識。更快的方式來搜索一個C#列表<String>的子串
無論如何,我真的需要做的是讓這個更高效,使用更少的資源,更快,所以有什麼辦法可以做到這一點?
使用蘭巴表達式,如果它是一個List<string>
:
list.RemoveAll(x => x.Contains(line_to_delete));
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));
這會讓你刪除的可讀性,但我不知道在與目前的方法相比的性能。
最簡單的方法是使用:
var result = list.Where(x => !x.Contains(line_to_delete))
首先,確認這是不是足夠有效的。如果不是,則需要使用高級數據結構來表示字符串,例如trie。在C#中沒有任何這種東西的本地支持。
最好的辦法是對列表進行排序,並使用二進制搜索。排序列表會爲你..這樣你就可以得到O(日誌(n))的性能
列表
不,這不因爲OP正在搜索匹配的子字符串。 – 2009-11-04 16:43:29
排序清單的成本是多少? – 2009-11-04 17:11:48
我覺得這是更好地的indexOf而不是包含使用,也加快了搜索
所以使用這樣做:
regkey.RemoveAll(k => k.IndexOf(line_to_delete) >=0);
這仍然會有O(n)性能 – mfeingold 2009-11-04 16:20:27
是的,但由於OP在子串上匹配,我不認爲SortedList會有所幫助。 – 2009-11-04 16:22:20
確實如此,但是您擁有二叉樹,您可以在現有樹上自己執行二分搜索。我們不是這麼困難,你會以這種方式得到O(log(n)) – mfeingold 2009-11-04 16:28:04