4

コレクションから n 個の要素を削除し、削除された n 個の要素を既存の別のコレクションに追加する最もパフォーマンスの高い方法は何ですか?

現在、私はこれを持っています:

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

ただし、これは私にはまったくパフォーマンスが良くないように見えます( 1つだけではなく複数の線形アルゴリズム)。

もちろん、次の要件が満たされている限り、考えられる解決策はコレクションの実装を変更する可能性があります。

  • otherCollectionを実装する必要IEnumerable<T>があります。現在のタイプですList<T>
  • collectionを実装する必要ICollection<T>があります。現在のタイプですLinkedList<T>

ヒント: エントリは必ずしもEquals()orを実装するとは限りません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 ステップに減らしたい。

4

2 に答える 2

3

前の関数は半分の結果しか返しません。以下を使用する必要があります。

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();
}
于 2014-09-16T08:22:21.603 に答える