强制创建惰性对象

时间:2013-10-04 10:17:07

标签: c# lazy-loading lazy-evaluation

我收到了Lazy项的集合。然后我想强行创造'他们一气呵成。

void Test(IEnumerable<Lazy<MailMessage>> items){
}

通常使用Lazy项,在访问其中一个成员之前,不会创建包含的对象。

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

var createdItems = items.Where(a => a.Value != null && a.Value.ToString() != null).Select(a => a.Value);

使用ToString()强制创建每个项目。

是否有更简洁的方法来强制创建所有项目?

3 个答案:

答案 0 :(得分:4)

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

var created = items.Select(c => c.Value).ToList();

答案 1 :(得分:3)

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

items.All(x => x.Value != null);

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

答案 2 :(得分:1)

<块引用>

由于没有 ForceCreate() 方法(或类似方法)

您始终可以为此在 ForceCreate() 上创建 Lazy<T> 扩展方法:

public static class LazyExtensions
{
    public static Lazy<T> ForceCreate<T>(this Lazy<T> lazy)
    {
        if (lazy == null) throw new ArgumentNullException(nameof(lazy));

        _ = lazy.Value;
        return lazy;
    }
}

...伴随着 ForEach 上的 IEnumerable<T> 扩展方法:

public static class EnumerableExtensions
{
    public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        if (enumerable == null) throw new ArgumentNullException(nameof(enumerable));
        if (action == null) throw new ArgumentNullException(nameof(action));            

        foreach (var item in enumerable)
        {
            action(item);
        }
    }
}

通过结合这两种扩展方法,您可以一次强行创建它们:

items.ForEach(x => x.ForceCreate());