以下是示例代码。我的循环只循环一次,即使其中有三个项目。 items[0].Duration
仅返回添加的热门商品。它没有循环遍历集合。
有什么想法吗?
public class DurationModel
{
public string Duration { get; set; }
public IEnumerable<List<DurationModel>> GetDurationItems()
{
List<DurationModel> durationItems = new List<DurationModel>();
durationItems.Add(new DurationModel()
{
Duration = "1 Day"
});
durationItems.Add(new DurationModel()
{
Duration = "1 Week"
});
durationItems.Add(new DurationModel()
{
Duration = "1 Month"
});
yield return durationItems;
}
}
public class MyForm
{
private ObservableCollection<string> _durationItems = new ObservableCollection<string>();
private IEnumerable<List<DurationModel>> _durationModel = new DurationModel().GetDurationItems();
public MyForm()
{
GetData();
}
private void GetData()
{
foreach (var items in _durationModel)
{
_durationItems.Add(items[0].Duration);
}
}
}
答案 0 :(得分:10)
使用yield return durationItems;
,您只返回一个List<DurationModel>
类型的项目。该列表实现了IEnumerable<DurationModel>
,换句话说,是 IEnumerable<DurationModel>
。因此,返回类型必须为IEnumerable<DurationModel>
而不是IEnumerable<List<DurationModel>>
,这将适合返回DurationModels
列表的枚举。
将方法更改为
public IEnumerable<DurationModel> GetDurationItems()
{
yield return new DurationModel { Duration = "1 Day" };
yield return new DurationModel { Duration = "1 Week" };
yield return new DurationModel { Duration = "1 Month" };
}
每个yield return
返回一个项目。或者,你可以写
public IEnumerable<DurationModel> GetDurationItems()
{
// This works because arrays implement IEnumerable<T>.
return new DurationModel[] {
new DurationModel { Duration = "1 Day" },
new DurationModel { Duration = "1 Week" },
new DurationModel { Duration = "1 Month" }
};
}
您也可以使用List<DurationModel>
。
请注意yield return
使方法暂停,记住其状态并返回。当foreach
请求下一个项目时,该方法会在最后一个yield return
之后恢复。 (另见Lars Corneliussen的Behind the scenes of the C# yield keyword)
使用第一种方法,项目在循环中使用时创建。对于第二个,它们都是在循环开始时创建的。
yield return
允许您以算法方式生成枚举,而无需将项目存储在集合中
public IEnumerable<int> ThousandSquares()
{
for (int i = 1; i <= 1000; i++) {
yield return i * i;
}
}
public void PrintSquares()
{
foreach (int n in ThousandSquares()) {
Console.WriteLine(n);
}
}
答案 1 :(得分:1)
为什么使用yield return durationItems;
代替return durationItems;
。
您应该在构造函数中添加_durationModel = new DurationModel().GetDurationItems();
,然后在调用getData
mainloop()