[英]Removing list item from another list
我有一個包含一些元素的列表,我想從另一個列表中刪除元素。 如果某個項目的值Contain
(而不是)另一個列表中的值,則應刪除該項目。
一種方法是執行此操作:
var MyList = new List<string> { ... }
var ToRemove = new List<string> { ... }
MyList.RemoveAll(_ => ToRemove.Any(_.Contains));
有用...
但是,我有很多列表(> 1百萬個),並且由於可以對ToRemove進行排序,因此使用它來加快處理速度是很有意義的。
創建循環很容易做到這一點,但是有沒有辦法對已排序的集合執行此操作?
更新:
在包含禁止列表的文本上進行20k次迭代后,我得到以下信息:
禁止列表為列表-> 00:00:07.1993364
禁止列表為HashSet-> 00:00:07.9749997
多次運行后保持一致,因此哈希集速度較慢
好吧,由於二進制搜索O(log n)
復雜性,排序ToRemove
可能是有益的(您將需要重寫_ => ToRemove.Any(_.Contains)
)。
但是,相反,對於ToRemove
使用HashSet<string>
而不是List<string>
會更快,因為在哈希集中查找元素(使用Contains
)是O(1)
操作。
同樣,對MyList
使用LinkedList<string>
可能會有好處,因為由於數組大小的調整,從鏈接列表中刪除項目通常比從基於數組的列表中刪除要快。
由於這是刪除包含另一個列表中的字符串的字符串,因此HashSet不會有太大幫助。 實際上,除非您要查找完全匹配的內容或維護所有子字符串的索引(否則,這很昂貴),而昂貴的AFIK僅SQL Server在BigData領域之外半有效地做到這一點。 如果您關心的只是它以“ ToRemove”中的項目開頭,則排序可能會有所幫助。 在“ ToRemove”自定義二進制搜索中對“ MyList”和foreach字符串進行排序,以找到以該字符串和RemoveAt索引開頭的任何字符串,直到沒有開頭為止,然后再遞減索引,直到沒有開頭為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.