C# 为什么我的foreach循环只循环一次,即使有3个项目?
下面是一个示例代码。我的循环仅循环一次,即使其中有三项<代码>项目[0]。持续时间仅返回添加的顶部项目。它不是在集合中循环 有什么想法吗C# 为什么我的foreach循环只循环一次,即使有3个项目?,c#,.net,C#,.net,下面是一个示例代码。我的循环仅循环一次,即使其中有三项项目[0]。持续时间仅返回添加的顶部项目。它不是在集合中循环 有什么想法吗 public class DurationModel { public string Duration { get; set; } public IEnumerable<List<DurationModel>> GetDurationItems() { List<DurationModel>
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);
}
}
}
公共类持续时间模型
{
公共字符串持续时间{get;set;}
公共IEnumerable GetDurationItems()
{
List durationItems=新列表();
添加(新的DurationModel()
{
持续时间=“1天”
});
添加(新的DurationModel()
{
持续时间=“1周”
});
添加(新的DurationModel()
{
持续时间=“1个月”
});
收益率-收益持续时间项;
}
}
公共类MyForm
{
私有ObservableCollection _durationItems=新ObservableCollection();
private IEnumerable_durationModel=新durationModel().GetDurationItems();
公共MyForm()
{
GetData();
}
私有void GetData()
{
foreach(持续时间模型中的var项目)
{
_durationItems.Add(项[0]。持续时间);
}
}
}
与收益回报期限项目
您只返回一个类型为List
的项目。列表实现了IEnumerable
,或者换句话说,是一个IEnumerable
。因此,返回类型必须是IEnumerable
而不是IEnumerable
,这将适合于返回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
使方法暂停,记住其状态并返回。当foreach
请求下一项时,该方法在最后一次返回后恢复。(另见Lars Corneliussen)
使用第一种方法,项目在循环中使用时创建。对于第二个循环,它们都是在循环开始时创建的
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);
}
}
public IEnumerable千方百计()
{
对于(int i=1;i带有收益返回期限项;
您只返回一个类型为List
的项目。列表实现IEnumerable
,或者换句话说,是一个IEnumerable
。因此,返回类型必须是IEnumerable
,而不是IEnumerable
,这将适合于返回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
使该方法暂停,记住其状态并返回。当foreach
请求下一项时,该方法在最后一次yield return
后恢复(另请参见Lars Corneliussen)
第一种方法是在循环中使用时创建项,第二种方法是在循环开始时创建项
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);
}
}
public IEnumerable千方百计()
{
对于(inti=1;i为什么要使用收益回报期限项目;
而不是回报期限项目;
。
您应该在构造函数中添加\u durationModel=new durationModel().GetDurationItems();
,然后调用getData为什么要使用yield return durationItems;
而不是return durationItems;
。
您应该在构造函数中添加\u durationModel=new durationModel().GetDurationItems();
,然后调用getData从现有集合中使用收益返回的“常用习惯用法:foreach(durationItems中的var项)收益返回项;
(即,对于每个项,分别收益)当然,在这种情况下,收益率返回通常是可以避免的..我不认为这是重复的,但看一看可能会有所帮助.tl;dr:-YourGetDurationItems
返回一个包含单个项的IEnumerable
,该项是一个包含三个DurationModel
实例的列表使用现有集合中的收益回报
的“常用习惯用法:foreach(durationItems中的var项目)收益回报项目;
(即,对于每个项目,分别收益。)当然,在这种情况下,收益率返回通常是可以避免的。我不认为这是重复的,但看一看可能会有所帮助。tl;dr:-YourGetDurationItems
返回一个包含单个项的IEnumerable
,该项是一个包含三个DurationModel
实例的列表。