【问题标题】:displaying structs in an array using enumerator使用枚举器在数组中显示结构
【发布时间】:2012-10-24 13:49:31
【问题描述】:

在我拥有的一个对象中:

public IEnumerable<voiture> recup_voitures()
{
    foreach (voiture v in _arrVCollection)
    {
        yield return (v);
    }
}

voiture 是一个结构,_arrVCollection 是一个包含一些结构体的数组。

在我的主要课程中:

 foreach (CarCollection.voiture o in collection.recup_voitures())
 {
     //some code to display the content of each struct
 }

发生的情况是,如果我有一个长度为 5 且其中只有 1 个结构体的数组,它将显示代码 5 次而不是仅 1 次。我做错了什么?

【问题讨论】:

  • 一个长度为 5 的数组,但里面只有 1 个 struct voiture 是什么意思?
  • voiture[] anArray = new voiture[5]; 然后anArray[0] = new voiture();
  • 没有理由在那个方法中yield return;你可以直接返回_arrVCollection,因为它实现了IEnumerable&lt;T&gt;

标签: c# arrays oop struct iterator


【解决方案1】:

如果你正在创建长度为 5 的结构数组,这意味着数组将包含 5 个使用默认构造函数构造的结构。

voiture[] arr = new voiture[5];
arr[0] = some_non-default_voiture;

在这种情况下,您的数组将包含一个非默认 voiture 实例和四个默认实例。

要只获取一个voiture 实例,您可以创建长度为1 的数组,或使用List&lt;T&gt;

List<voiture> = new List<voiture> { new voiture() };

如果确实需要处理长度为 5 的数组,可以考虑使用可空类型:

voiture?[] _arrVCollection = new voiture?[5];
_arrVCollection[0] = new voiture();

然后像这样枚举:

public IEnumerable<voiture> recup_voitures()
{
    foreach (voiture? v in _arrVCollection)
    {   if (v.HasValue)
            yield return v.Value;
    }
}

编辑:

正如Servy所说,方法recup_voitures()可以用linq重写:

public IEnumerable<voiture> recup_voitures()
{
    return _arrVCollection.Where(x => x.HasValue).Select(x => x.Value);
}

【讨论】:

  • 你的最后一个方法很有效!谢谢!现在我要去阅读什么是可空类型:)
  • 而不是在第二种情况下使用迭代器块,你可以return _arrVCollection.Where(v =&gt; v.HasValue);
  • @Servy,非常同意。只是用 OP 风格写的。
【解决方案2】:

在您当前的代码中,您会遇到异常。

如果voiture 是类,您可以更改recup_voitures 方法中的代码:

 public static IEnumerable<voiture> recup_voitures()
        {
            foreach (voiture v in _arrVCollection)
            {
                if (v != null)
                    yield return (v);
            }
        }

【讨论】:

  • 它们永远不会为空,因为它们是结构
  • 哦……我的错。我认为voiture是一门课。
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2019-03-02
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多