Найкращий підхід з точки зору продуктивності - це, мабуть, використання одного або двох масивів. Скопіюйте список у масив, виконайте операції з ним, а потім створіть новий список із масиву. Доступ до елемента масиву відбувається швидше, ніж доступ до елемента списку, і перетворення між a List<T>
та a T[]
можуть використовувати швидку операцію "масового копіювання", яка дозволяє уникнути накладних, пов'язаних з доступом до окремих елементів.
Наприклад, припустімо, що у вас є List<string>
і ви хочете, щоб кожен рядок у списку, який починається з T
, мав пункт "Boo", тоді як кожен рядок, що починається з "U", повністю відпадає. Оптимальним підходом може бути щось на зразок:
int srcPtr,destPtr;
string[] arr;
srcPtr = theList.Count;
arr = new string[srcPtr*2];
theList.CopyTo(arr, theList.Count);
destPtr = 0;
for (; srcPtr < arr.Length; srcPtr++)
{
string st = arr[srcPtr];
char ch = (st ?? "!")[0];
if (ch != 'U')
arr[destPtr++] = st;
if (ch == 'T')
arr[destPtr++] = "Boo";
}
if (destPtr > arr.Length/2)
{
theList = new List<String>(arr);
if (destPtr != arr.Length)
theList.RemoveRange(destPtr, arr.Length-destPtr);
}
else
{
Array.Resize(ref arr, destPtr);
theList = new List<String>(arr);
}
Було б корисно, якби List<T>
запропонував метод для побудови списку з частини масиву, але я не знаю жодного ефективного методу для цього. Тим не менше, операції з масивами відбуваються досить швидко. Заслуговує на увагу той факт, що додавання та вилучення предметів зі списку не вимагає "натискання" навколо інших елементів; кожен елемент записується безпосередньо у відповідне місце в масиві.