有没有更快的方法来克隆项目列表?

时间:2015-04-23 19:11:16

标签: c# performance list clone

克隆项目的方法是否比下面显示的更快?

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();
    }
}

3 个答案:

答案 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更快地摆脱分配和垃圾收集。

但是,如果您可以重新构建其余的代码而不需要整个列表,那么管道就是最好的选择。