Ant*_*Lev 1 c# arrays oop struct iterator
在我有一个对象:
public IEnumerable<voiture> recup_voitures()
{
foreach (voiture v in _arrVCollection)
{
yield return (v);
}
}
Run Code Online (Sandbox Code Playgroud)
voiture是一个结构,_arrVCollection是一个包含一些结构的数组.
在我的主要课程中,我有:
foreach (CarCollection.voiture o in collection.recup_voitures())
{
//some code to display the content of each struct
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是,如果我有一个长度为5且只有1个结构的数组,它将显示代码5次而不是1次.我做错了什么?
如果要创建长度为struct的数组,比如5,则表示数组将包含使用默认构造函数构造的5个结构.
voiture[] arr = new voiture[5];
arr[0] = some_non-default_voiture;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您的数组将包含一个非默认voiture实例和四个默认实例.
要只获取一个voiture实例,您可以创建长度为1的数组,或使用List<T>:
List<voiture> = new List<voiture> { new voiture() };
Run Code Online (Sandbox Code Playgroud)
如果你真的需要处理长度为5的数组,可以考虑使用可空类型:
voiture?[] _arrVCollection = new voiture?[5];
_arrVCollection[0] = new voiture();
Run Code Online (Sandbox Code Playgroud)
并列举如下:
public IEnumerable<voiture> recup_voitures()
{
foreach (voiture? v in _arrVCollection)
{ if (v.HasValue)
yield return v.Value;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
正如Servy所提到的,方法recup_voitures()可以用linq重写:
public IEnumerable<voiture> recup_voitures()
{
return _arrVCollection.Where(x => x.HasValue).Select(x => x.Value);
}
Run Code Online (Sandbox Code Playgroud)