考虑这种方法:
public IEnumerable<T> GetList(int Count)
{
foreach (var X in Y)
{
// do a lot of expensive stuff here (e.g. traverse a large HTML document)
// when we reach "Count" then exit out of the foreach loop
}
}
我会这样称呼:Class.GetList(10);
会返回10件物品 - 这很好。
我想使用IEnumerable
的{{1}}方法代替我使用Take()
,我希望foreach循环能够以某种方式获取我传入{{1}的数字}} - 这可能吗?这似乎是一种更清洁的方法,因为它最终会更便宜,因为我可以使用Class.GetList().Take(10)
一次获取完整列表,然后使用Take()
的方法来获取x项。
谢谢你们!
答案 0 :(得分:6)
您可以通过将方法实现为迭代器块来实现:
public IEnumerable<T> GetList()
{
foreach (var X in Y)
{
// do something
yield return something;
}
}
当你致电Take(10)
时,只会产生前10个元素 - 方法的其余部分将不会被运行。
答案 1 :(得分:4)
在GetList
方法中使用yield return
。这样,您可以使用Take(10)
而不使用GetList
方法首先返回整个结果。
答案 2 :(得分:1)
不,这是不可能的。但是,Take(10)
所做的是它只获得Enumerable
的10个项目。通过Count
检查您要完成的任务,Take()
会为您执行此操作,因为当它有10个项目时,它会直接停止从您的枚举器中获取项目。