强制创建惰性对象

max*_*axp 5 c# lazy-loading lazy-evaluation

我正在收集一些Lazy物品.然后我想要一次性强行"创造"它们.

void Test(IEnumerable<Lazy<MailMessage>> items){
}
Run Code Online (Sandbox Code Playgroud)

通常使用Lazy项目,只有访问其中一个成员,才会创建包含的对象.

看到没有ForceCreate()方法(或类似),我被迫做以下事情:

var createdItems = items.Where(a => a.Value != null && a.Value.ToString() != null).Select(a => a.Value);
Run Code Online (Sandbox Code Playgroud)

这是使用ToString()给力创建的每个项目.

有没有更简洁的方法来强行创建所有项目?

Ahm*_*IEM 5

要获取所有延迟初始化值的列表:

var created = items.Select(c => c.Value).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 不,访问 [`Value`](http://msdn.microsoft.com/en-us/library/dd642177.aspx) 已经足够了 (2认同)
  • 这将分配 O(n) 内存,只需使用 `foreach (var x in items) _ = x.Value;` (2认同)

Guf*_*ffa 2

您需要两件事来创建所有惰性项目,您需要枚举所有项目(但不一定保留它们),并且您需要使用属性Value来创建项目。

items.All(x => x.Value != null);
Run Code Online (Sandbox Code Playgroud)

All方法需要查看所有值来确定结果,因此这将导致枚举所有项目(无论集合的实际类型是什么),并且Value在每个项目上使用属性将导致它创建其对象。(这!= null部分只是为了设置一个该All方法适合的值。)

  • 请注意,如果任何 Lazy 项的“.Value”为“null”,则可枚举中的后续项可能不会调用“.Value”,因为“All()”在看到第一个“假”。 (5认同)