拿&从集合中删除元素

时间:2013-09-03 20:26:42

标签: c# .net linq collections time-complexity

从集合中删除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步=&gt;我想将它减少到1000步。

2 个答案:

答案 0 :(得分:2)

使用您的用例,最佳数据结构似乎是一个队列。使用队列时,您的方法可以这样看:

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

答案 1 :(得分:2)

上一个函数只返回一半结果。你应该使用:

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