Массив копии C# значением

dd if=/dev/zero of=upload_test bs=file_size count=1

, Где file_size размер Вашего тестового файла в байтах

16
задан Nicholas Carey 26 July 2013 в 19:45
поделиться

3 ответа

Реализуйте метод клонирования в MyType, используя защищенный метод MemberwiseClone (выполняет поверхностное копирование) или используя технику глубокого клонирования. Вы можете заставить его реализовать ICloneable, а затем написать несколько методов расширений, которые будут клонировать соответствующую коллекцию.

interface ICloneable<T>
{
    T Clone();
}

public static class Extensions
{
    public static T[] Clone<T>(this T[] array) where T : ICloneable<T>
    {
        var newArray = new T[array.Length];
        for (var i = 0; i < array.Length; i++)
            newArray[i] = array[i].Clone();
        return newArray;
    }
    public static IEnumerable<T> Clone<T>(this IEnumerable<T> items) where T : ICloneable<T>
    {
        foreach (var item in items)
            yield return item.Clone();
    }
}

Вы должны сделать это, потому что при создании нового массива при использовании Array.Copy он копирует ссылки, а не объекты, на которые ссылаются. Каждый тип отвечает за собственное копирование.

9
ответ дан 30 November 2019 в 16:09
поделиться

Если ваш тип сериализуемый, вы можете используйте методы сериализации, чтобы получить копию вашего массива (включая глубокие копии элементов):

private static object GetCopy(object input)
{
    using (MemoryStream stream = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, input);
        stream.Position = 0;
        return formatter.Deserialize(stream);
    }
}

Чтобы использовать его:

MyType[] items = new MyType[2];
// populate the items in the array

MyType[] copies = (MyType[])GetCopy(items);
7
ответ дан 30 November 2019 в 16:09
поделиться

Судя по первому сообщению, все, что ему нужно, это для "независимой копии массив ». Изменения самого массива shallowCopy не будут отображаться в массиве types (что означает назначение элемента, что он действительно показал выше, несмотря на то, что он сказал «глубокую копию»). Если это соответствует вашим потребностям, он будет иметь лучшую производительность.

MyType[] shallowCopy = (MyType[])types.Clone();

Он также упоминает «глубокую копию», которая будет отличаться для изменяемых типов, которые не являются рекурсивными агрегатами типов значений примитивов. Если MyType реализует ICloneable , это отлично подходит для глубокой копии:

MyType[] deepCopy = (MyType[])Array.ConvertAll(element => (MyType)element.Clone());
13
ответ дан 30 November 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: