从性能角度来看,最好的方法可能是使用一个或两个阵列。将列表复制到数组,对该数组执行操作,然后从该数组构建新列表。访问数组元素比访问列表项要快,并且aList<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>
提供了一种从数组的一部分构造列表的方法,那将很有帮助,但我不知道这样做的任何有效方法。尽管如此,对阵列的操作还是非常快的。值得注意的事实是,从列表中添加和删除项目不需要“推”其他项目。每个项目都直接写入数组中的适当位置。