パフォーマンスの観点からの最善のアプローチは、おそらく 1 つまたは 2 つのアレイを使用することです。リストを配列にコピーし、配列に対して操作を行ってから、配列から新しいリストを作成します。配列要素へのアクセスは、リスト項目へのアクセスよりも高速であり、 とList<T>
の間の変換でT[]
は、個々の項目へのアクセスに関連するオーバーヘッドを回避する高速な「一括コピー」操作を使用できます。
たとえば、 がありList<string>
、リスト内のすべての文字列のT
後に項目 "Boo" が続き、"U" で始まるすべての文字列が完全に削除されるとします。最適なアプローチは、おそらく次のようなものです。
int srcPtr,destPtr;
string[] arr;
srcPtr = theList.Count;
arr = new string[srcPtr*2];
theList.CopyTo(arr, theList.Count); // Copy into second half of the array
destPtr = 0;
for (; srcPtr < arr.Length; srcPtr++)
{
string st = arr[srcPtr];
char ch = (st ?? "!")[0]; // Get first character of string, or "!" if empty
if (ch != 'U')
arr[destPtr++] = st;
if (ch == 'T')
arr[destPtr++] = "Boo";
}
if (destPtr > arr.Length/2) // More than half of dest. array is used
{
theList = new List<String>(arr); // Adds extra elements
if (destPtr != arr.Length)
theList.RemoveRange(destPtr, arr.Length-destPtr); // Chop to proper length
}
else
{
Array.Resize(ref arr, destPtr);
theList = new List<String>(arr); // Adds extra elements
}
配列の一部からリストを作成する方法があれば役に立ちList<T>
ましたが、それを行うための効率的な方法を知りません。それでも、配列に対する操作はかなり高速です。注目すべきは、リストにアイテムを追加したりリストから削除したりするために、他のアイテムを「プッシュ」する必要がないという事実です。各アイテムは、配列内の適切な場所に直接書き込まれます。