簡體   English   中英

從另一個列表中刪除列表項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM