从集合中删除n个元素并将删除的n个元素添加到已经存在的不同集合中的最有效方式是什么?

目前我有这个:

var entries = collection.Take(5).ToList();
foreach(var entry in entries)
    collection.Remove(entry);
otherCollection.AddRange(entries);


但是,这对我来说似乎根本没有性能(多种线性算法,而不仅仅是一种)。

当然,可能的解决方案可能会更改收集的实现-只要满足以下要求:


otherCollection必须实现IEnumerable<T>,当前为List<T>类型
collection必须实现ICollection<T>,当前为LinkedList<T>类型


提示:条目不一定实现Equals()GetHashCode()

达到目标的最有效方式是什么?



由于显然很难理解我的性能注意事项,因此在这里再次给出我的代码示例:

var entries = collection.Take(1000).ToList(); // 1000 steps
foreach(var entry in entries) // 1000 * 1 steps (as Remove finds the element always immediately at the beginning)
    collection.Remove(entry);
otherCollection.AddRange(entries); // another 1000 steps


=总共3000步=>我想将其减少到单个1000步。

最佳答案

对于您的用例,最好的数据结构似乎是一个队列。使用队列时,您的方法可以如下所示:

public static IEnumerable<T> TakeAndRemove<T>(Queue<T> queue, int count)
{
   count = Math.Min(queue.Count, count);
   for (int i = 0; i < count; i++)
      yield return queue.Dequeue();
}

10-06 10:06