У меня есть список с большим количеством элементов. Мне нужно создать копию этого списка, чтобы выполнять с ним операции, не изменяя исходный список. Однако операции обычно обращаются только к небольшой части элементов списка, поэтому неэффективно копировать все, когда большая часть не используется. Есть ли простой способ создать объект, который является клоном списка, но только клонирует элементы при доступе к ним? Я изучил класс Lazy<T>
, который, кажется, мне нужен, но я не знаю, как его применить в этой ситуации.
Я хочу сделать что-то вроде этого:
LazyListCopy<SomeType> lazyCopy = LazyListCopy.Copy(myList); // No elements have been copied at this point
DoSomethingWith(lazyCopy[34]); // 35th element has now been copied
И это:
foreach(SomeType listElement in LazyCopy.Copy(myOtherList))
{
if (!Check(listElement)) // Object corresponding to listElement has been cloned
break;
}
Я не возражаю, если решение недостаточно универсальное для обработки списков любого типа; Я был бы доволен, если бы он был привязан к одному или двум созданным мной классам.
Предпочтительно это будет глубокая копия, а не мелкая, но мелкая копия все равно будет полезна, и я был бы признателен за примеры этого, если бы она была короче / проще.
IEnumerable<SomeType> lazyClone = myList.Select(element => element.Clone())
, элементы вlazyClone
клонируются только при доступе к ним? - person Strigoides   schedule 17.10.2012lazyClone
запрос будет выполнен, когда вы начнете его использовать - person Sergey Berezovskiy   schedule 17.10.2012Game
, который необходимо клонировать перед выполнением исследуемого хода, чтобы ходы не изменяли исходный игровой объект. - person Strigoides   schedule 17.10.2012List<Game>
илиGame
содержит список? Если первое, то почему вы беспокоитесь о клонировании самого списка - просто выберитеGame
из списка, клонируйтеGame
и выполните проверки на клоне. - person Rawling   schedule 17.10.2012