为什么即使有3个项目,我的foreach循环只循环一次?

时间:2018-01-16 22:56:49

标签: c# .net

以下是示例代码。我的循环只循环一次,即使其中有三个项目。 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);
        }
    }   
}

2 个答案:

答案 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()