【问题标题】:foreach can not get an enumerator of a struct elementforeach 无法获取结构元素的枚举器
【发布时间】:2014-05-12 18:08:15
【问题描述】:

我有一个这样的结构,我有一个数组sorular[] soru

public struct sorular
{
   public string resim;
   public string soru;
   public string seceneka;
   public string secenekb;
   public string secenekc;
   public string secenekd;
   public int dogrucevap;
   public int verilencevap;
}

我想使用foreach 循环,例如:

foreach (int i in sorular.dogrucevap)
{

}

但由于cant get enumerator of dogrucevap 错误,我不能这样做。我不想使用whilefor 循环:)

【问题讨论】:

  • 是单个字段public int dogrucevap;,不是int的集合。你不能枚举它。
  • Foreach (sorular s in soru) { int i = s.dogrucevap; } 有什么问题?
  • @Brian:如果不实现 IEnumerable 仍然无法工作
  • @PierreOverFlow - soru 是一个数组。它实现了 IEnumerable。
  • @TravisJ:我没有看到问题的第一行,是的,你说的很对

标签: c# foreach ienumerator


【解决方案1】:

您不能迭代不是集合或其他可迭代类型的东西。

根据您的更新,我认为您正在寻找以下内容:

foreach (sorular s in soru) {
    var i = s.dogrucevap;
    ...
}

【讨论】:

  • Thx Zachary 我需要知道的是我有结构数组 :) 感谢所有帮助过我的人 :)
【解决方案2】:

我有一个数组 sorular[] soru。

由于在 soru 中有一个这些结构的数组,您可以从它们中投影以获得一组 dogrucevap 值。

IEnumerable<int> dogrucevaps = soru.Select(s => s.dogrucevap);

然后你可以迭代这些

foreach( int i in dogrucevaps )
{
   //TODO: use i
}

精简版

foreach(int i in soru.Select(s => s.dogrucevap))
{
   //TODO: use i    
}

【讨论】:

    【解决方案3】:

    为了在foreach 语句中使用sorular.dogrucevap,它应该返回具有GetEnumerator 方法的对象(或实现IEnumerable 接口)。

    为什么你有 'cant get enumerator of dogrucevap' 错误?

    Foreach 语句枚举集合的元素,为集合的每个元素执行嵌入语句,并将其定义为(C# Specification 8.8.4 The foreach 语句):

    foreach (local-variable-type identifier in expression)
        embedded-statement
    

    如果foreach语句中的表达式不是数组或动态的,那么它应该有适当的GetEnumerator方法,定义为:

    类型 X 上的成员,标识符为 GetEnumerator 和 没有类型参数。

    在你的情况下,表达式返回int类型的值。因此int 没有GetEnumerator 方法,它不能在foreach 语句中使用。实际上它没有任何意义,因为int 看起来不像集合。您希望以整数值42 枚举哪些项目?

    如何解决问题?假设您要枚举结构数组中的结构。那么代码应该是这样的

     sorular[] soru;
     // intialize and fill array
    
     foreach(sorular s in soru)
     {
        // use s.dogrucevap
     }
    

    或者如果你想枚举数组中结构的dogrucevap值,那么你可以通过只选择这个值来project数组项:

     foreach(int dogrucevap in soru.Select(s => s.dogrucevap))
     {
         // use dogrucevap
     }
    

    【讨论】:

    • “sorular.dogrucevap”在 foreach 循环中没有任何意义,它是一个整数类型,不是迭代类型。
    【解决方案4】:

    你的值是整数 - 你不能直接迭代整数。

    如果您只希望单个项目的foreach - 单个项目的Enumerable.Repeat 进行一次迭代:

    foreach(int i in Enumerable.Repeat(questions.dogrucevap,1 ))
    {
    
    }
    

    如果您的“dogrucevap”变量意味着“从 1 到 dogrucevap”,您可以从中构造 Range 并在范围内构造 foreach

    foreach(int i in Enumerable.Range(1,questions.dogrucevap))
    {
    
    }
    

    【讨论】:

      【解决方案5】:

      首先,最好使用类来代替结构。

      当您使用数组 sorular[] soru 时,您可以执行以下操作:

      foreach (var item in soru)
      {
          // do something with item.dogrucevap which is an int
      }
      

      或者,如果您想遍历结构的字段,您可以使用反射。

      【讨论】:

      • 工作 thx 没想到我的这个智障大脑 :) 我也会寻找反思来给出答案 :)
      • 如果您能够接受这个作为答案,那将会很有帮助。
      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多