foreach无法获取struct元素的枚举器

时间:2014-05-12 18:08:15

标签: c# foreach ienumerator

我有这样的结构,我有一个数组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循环:)

5 个答案:

答案 0 :(得分:5)

您无法迭代不是集合或其他可迭代类型的内容。

根据您的更新,我相信您正在寻找:

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

答案 1 :(得分:2)

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

为什么无法获得dogrucevap' 错误的调查员?

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

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

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

  类型为X的

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

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

如何解决问题?假设您要枚举structs数组中的结构。然后代码看起来像

 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
 }

答案 2 :(得分: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 :(得分:0)

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

如果你只想要foreach单项 - Enumerable.Repeat单个项目进行一次迭代:

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

}

如果你&#34; dogrucevap&#34; varialbe意味着什么&#34;从1到dogrucevap&#34;您可以在其中构建Range并在范围内构建foreach

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

}

答案 4 :(得分:0)

首先,您最好不要使用结构,而是使用类。

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

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

或者,如果要迭代结构的字段,可以使用反射。