【问题标题】:Lazy list clone惰性列表克隆
【发布时间】: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&lt;SomeType&gt; lazyClone = myList.Select(element =&gt; element.Clone()) 之类的东西,lazyClone 中的元素只会在被访问时被克隆?
  • @Strigoides 确切地说,lazyClone 查询将在您开始使用时执行
  • @TimSchmelter 我明白了。在这种情况下,我必须创建列表的副本并对其进行修改。
  • 是的,但问题是您是否需要创建一个克隆。你有一个你想要做什么的例子吗?

标签: c# list copy clone lazy-evaluation


【解决方案1】:

听起来您想要以原始列表和稀疏的覆盖集合结束。

为什么不为覆盖创建一个字典,将索引键入原始列表?然后,您可以根据需要从原始列表中手动添加值。

如果您要经常使用它,您可以将此功能包装到一个包装 IList&lt;T&gt; 的类中。

【讨论】:

    猜你喜欢
    • 2019-10-24
    • 2010-10-05
    • 2013-06-26
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多