克隆项目的方法是否比下面显示的更快?
private List<T> CloneItems(List<T> itemsToClone) {
lock (dataLocker) {
Stopwatch sw = Stopwatch.StartNew();
int numItems = itemsToClone.Count;
List<T> itemsToBeReturned = new List<T>(numItems);
for (int i = 0; i < numItems; i++) {
itemsToBeReturned.Add((T)itemsToClone[i].Clone());
}
Debug.WriteLine("CloneItems(ms): " + sw.Elapsed.TotalMilliseconds.ToString("F3"));
return itemsToBeReturned;
}
}
编辑:我需要一份深层副本,目前正在使用以下对象:
public class TimestampedDouble {
public long Timestamp { get; set; }
public double Voltage { get; set; }
public double Current { get; set; }
...
public override object Clone() {
return MemberwiseClone();
}
}
答案 0 :(得分:0)
您可以使用这样的扩展方法:
static class Extensions
{
public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
{
return listToClone.Select(item => (T)item.Clone()).ToList();
}
}
答案 1 :(得分:0)
就像其他人提到的那样,你需要找到实际的瓶颈。上面的代码在它的功能方面相当紧凑。可能,它是克隆而不是你的循环。但是,事实证明微软已经在ConvertAll方法中为你做了那个循环,你可以重新实现上面的代码:
var finallist = itemsToClone.ConvertAll<T>(o => (T)o.Clone());
然而,我猜它不会赢,因为如果我被要求实施ConvertAll,我会做一些接近你的循环。事实上,that's pretty much what MS did。
这会直接指向你的Clone
方法作为罪魁祸首。
答案 2 :(得分:0)
对我来说非常可靠。其他建议是更少的代码,但不会更快。特别是没有预先分配数组大小的建议。
我最好的想法是让TimestampedDouble
struct
更快地摆脱分配和垃圾收集。
但是,如果您可以重新构建其余的代码而不需要整个列表,那么管道就是最好的选择。