方法的可枚举和延迟执行

时间:2015-03-18 16:12:10

标签: c# linq

我有一个方法:int[] GetNumbers ();,它会立即返回数字数组。但是我只能在初始化类时调用此方法。我不能手动初始化这个类,它由别人在其他地方初始化 我想创建IEnumerable,当我开始迭代那个可枚举时,它会调用GetNumbers()

示例:

    IEnumerable<int> numbers = new SomeKindOfWrapper (() => GetNumbers());

现在只有在我尝试访问GetNumbers()时才会调用numbers

如何实现这一目标? .NET框架中是否有支持它的东西?

我可以将委托传递给我的类,它将调用GetNumbers(),但我更喜欢IEnumerable。

2 个答案:

答案 0 :(得分:5)

只需创建一个调用委托的迭代器块,然后生成序列中的值:

public static IEnumerable<T> SomeKindOfWrapper<T>(
    Func<IEnumerable<T>> generator)
{
    foreach(var item in generator())
        yield return item;
}

如果您想确保不会多次调用该委托,您可以使用Lazy代替:

public static IEnumerable<T> SomeKindOfWrapper<T>(
    Lazy<IEnumerable<T>> sequence)
{
    foreach(var item in sequence.Value)
        yield return item;
}

答案 1 :(得分:2)

您可以使用的一种包装是Lazy<T>

Lazy<IEnumerable<int>> numbers = new Lazy<IEnumerable<int>>(() => GetNumbers());

您可以使用numbers.Value,或为其添加包装器属性:

IEnumerable<int> Numbers {
    get {
        return numbers.Value;
    }
}

GetNumbers()的来电被推迟到numbers.Value的第一次通话。之后,结果存储在Lazy<T>中,并在numbers.Value的后续调用中返回给您。