У меня есть 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 - это ссылочный тип. Поэтому присвоение одного объекта другому, это просто копирование указателя.
Для клонирования того же класса в 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).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Суть в том, что есть 9 кнопокЕсли нажать на одну из этих кнопок на этой кнопке должен появиться текст "Х"
Пытаюсь разобраться с анимацией в MVVMУсловно имеется 2 View
Есть 9 кнопок, при нажатии на произовльную кнопку(при условии, что все остальные пустые) ставится текст "Х" на неёЕсли выбрать след