【发布时间】:2012-10-07 10:08:00
【问题描述】:
我有一个包含大量元素的列表。我需要创建此列表的副本以在不更改原始列表的情况下对其执行操作。但是,这些操作通常只访问列表的一小部分元素,因此当大部分内容都未使用时,复制整个内容是低效的。有没有一种简单的方法来创建一个作为列表克隆的对象,但只在访问元素时克隆它们?我查看了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;
}
我不介意解决方案是否不够通用,无法处理任何类型的列表;我可以将它专门用于我创建的一两个类。
最好是深拷贝而不是浅拷贝,但浅拷贝仍然有用,如果它也更短/更简单,我将不胜感激。
【问题讨论】:
-
您可以使用天生懒惰的 LINQ。然后你根本不需要创建副本(如果你不想的话)。
-
@TimSchmelter 所以,如果我使用
IEnumerable<SomeType> lazyClone = myList.Select(element => element.Clone())之类的东西,lazyClone中的元素只会在被访问时被克隆? -
@Strigoides 确切地说,
lazyClone查询将在您开始使用时执行 -
@TimSchmelter 我明白了。在这种情况下,我必须创建列表的副本并对其进行修改。
-
是的,但问题是您是否需要创建一个克隆。你有一个你想要做什么的例子吗?
标签: c# list copy clone lazy-evaluation