Как создать копию List<T>?

239
12 сентября 2021, 15:00

У меня есть List внутри которого LanguageSet

 public class LanguageSet
    {
        private string _langname;
        private string _isoname;
        public string Langname
        {
            get => _langname;
            set => _langname = value;
        }
        public string Isoname
        {
            get => _isoname;
            set => _isoname = value;
        }
        Dictionary<string, string> langDct = new Dictionary<string, string>();
        public Dictionary<string, string> GetLanguageDictionary()
        {
            return langDct;
        }
        public Dictionary<string, string> SetLanguageDictionary(Dictionary<string, string> dct)
        {
            return langDct = dct;
        }
    }

Объявленный List

List<LanguageSet> langList = new List<LanguageSet>();

Как мне создать List,который будет являться копией langList?

Я пытался объявить новый объект и присвоить значение

List<LanguageSet> langlist_temp = new List<LanguageSet>()
langlist_teml = langlist;

Но потом я понял, что List - это ссылочный тип. Поэтому присвоение одного объекта другому, это просто копирование указателя.

Answer 1

Для клонирования того же класса в C# предусмотрен интерфейс ICloneable. Реализовав его, вы сможете вызвать метод Clone(), который отдаст вам копию объекта.

Реализация такого класса будет выглядеть примерно так:

class Test : ICloneable
{
    public string Name { get; set; }
    public int Value { get; set; }
    public object Clone() => MemberwiseClone();
}

Заметьте, тут я использовал MemberwiseClone(), он сам сделает копию текущего объекта, но не глубокую! Это надо учесть.

Дальше нам остается создать новую коллекцию и перенести в нее копии объектов, что то вроде этого:

foreach(var item in mainList)
{
    copiedList.Add((Test)item.Clone());
}

Для облегчения этого процесса можно сделать например расширение, которое при помощи того же LINQ в пару строк реализует нам все необходимое:

static class Extensions
{
    public static IList<T> Clone<T>(this IList<T> source) where T : ICloneable 
        => source.Select(item => (T)item.Clone()).ToList();
}

Ну и вызываем:

var copiedList = mainList.Clone();

Небольшой тест этого всего:

var mainList = new List<Test>
{
    new Test { Name = "Test", Value = 111 }
};
var copiedList = mainList.Clone();
mainList[0].Value = 1;
copiedList[0].Value = 2;
Console.WriteLine(mainList[0].Value);
Console.WriteLine(copiedList[0].Value);

Результатом будет два числа (1 и 2).

READ ALSO
Цикл для массива кнопок

Цикл для массива кнопок

Суть в том, что есть 9 кнопокЕсли нажать на одну из этих кнопок на этой кнопке должен появиться текст "Х"

304
При обращение к View каждый раз срабатывает get{} у свойств

При обращение к View каждый раз срабатывает get{} у свойств

Пытаюсь разобраться с анимацией в MVVMУсловно имеется 2 View

104
Как чередовать вывод информации в c#?

Как чередовать вывод информации в c#?

Есть 9 кнопок, при нажатии на произовльную кнопку(при условии, что все остальные пустые) ставится текст "Х" на неёЕсли выбрать след

104
new virtual метод что значит? [дубликат]

new virtual метод что значит? [дубликат]

Почему в этом случае выведется на экран "A"?

251