【问题标题】:Array Clone & Copy still effect original [duplicate]阵列克隆和复制仍然有效[重复]
【发布时间】:2024-01-08 00:26:01
【问题描述】:

我正在传入一个我想要 UNTOUCHED 的对象数组,但由于某种原因,无论我尝试什么,传入的原始数组都被更改了。

private DSPPositionPeriodDO[] CompactShortTermData(DSPPositionPeriodDO[] data)
{
    DSPPositionPeriodDO[] resultArray = (DSPPositionPeriodDO[])data.Clone();
    int? hoursToAggBy = null;
    // it is short term, the data gets too much so decide how many
    // hours to aggregate by.
    var days = (_endDate - _startDate).TotalDays;
    if (days <= 3)
        hoursToAggBy = null;
    else if (days > 3 && days <= 7)
        hoursToAggBy = 1;
    else if (days > 7 && days <= 14)
        hoursToAggBy = 2;
    else if (days > 14 && days <= 21)
        hoursToAggBy = 3;
    else if (days > 21)
        hoursToAggBy = 4;

    if (hoursToAggBy != null)
    {
        // round down hours
        foreach (var posPeriod in resultArray)
        {
            var sl = posPeriod.StartLocal;
            sl = sl.AddHours(-(sl.Hour % hoursToAggBy.Value));
            sl = sl.AddMinutes(-sl.Minute);
            posPeriod.StartLocal = sl;
        }

        // group by entity & time -- get average
        var groupedData = resultArray.GroupBy(x => new
        {
            x.EntityId,
            x.EntityCode,
            x.StartLocal
        })
        .Select(g => new DSPPositionPeriodDO
        {
            EntityId = g.Key.EntityId,
            EntityCode = g.Key.EntityCode,
            StartLocal = g.Key.StartLocal,
            Volume = g.Average(v => v.Volume),
            AverageVolume = null
        });

        resultArray = groupedData.ToArray();
    }
}

我尝试创建一个单独的副本,例如:

var x = original.ToArray()

toList()

Clone()

等等

original 是指传入的 data 对象。我希望它根本不被更改。

【问题讨论】:

  • Clone in array 执行浅拷贝,即它不会创建对象本身的副本
  • 如果您不希望这种情况发生,那么数组中的对象必须是值类型,或者您必须手动深度克隆它们。

标签: c# arrays copy clone


【解决方案1】:

来自Array.Clone

新 Array 中的引用指向的对象与原始 Array 中的引用指向的对象相同。

您需要将 每个 对象克隆到新数组中。

【讨论】: