我有一个方法:int[] GetNumbers ();
,它会立即返回数字数组。但是我只能在初始化类时调用此方法。我不能手动初始化这个类,它由别人在其他地方初始化
我想创建IEnumerable
,当我开始迭代那个可枚举时,它会调用GetNumbers()
。
示例:
IEnumerable<int> numbers = new SomeKindOfWrapper (() => GetNumbers());
现在只有在我尝试访问GetNumbers()
时才会调用numbers
。
如何实现这一目标? .NET框架中是否有支持它的东西?
我可以将委托传递给我的类,它将调用GetNumbers(),但我更喜欢IEnumerable。
答案 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
的后续调用中返回给您。