C# foreach无法获取结构元素的枚举数

C# foreach无法获取结构元素的枚举数,c#,foreach,ienumerator,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 v

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

}

但是我不能这样做,因为
无法获取dogrucevap的枚举数
错误。我不想使用
while
for
循环:)

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

为什么出现“无法获取dogrucevap枚举数”错误?

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

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

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

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

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

 sorular[] soru;
 // intialize and fill array

 foreach(sorular s in soru)
 {
    // use s.dogrucevap
 }
或者,如果要枚举数组中结构的
dogrucevap
值,则可以仅选择此值来对项目进行数组:

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

您不能迭代非集合或其他iterable类型的内容

根据您的更新,以下是我相信您正在寻找的内容:

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

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

如果您只需要单个项目的
foreach
可枚举。对单个项目重复
,以进行一次迭代:

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

}
如果您的“dogrucevap”变量是指“从1到dogrucevap”的意思,您可以从中构建
Range
,并在Range上构建
foreach

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

}

首先,与其使用结构,不如使用类

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

foreach (var item in soru)
{
    // do something with item.dogrucevap which is an int
}
或者,如果要在结构的字段上迭代,可以使用反射

我有一个数组sorular[]soru

由于soru中有这些结构的数组,所以可以从中投影以获得一组dogrucevap值

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

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

它是一个单一字段
public int dogrucevap,它不是
int
的集合。您不能枚举它。
Foreach(soru中的sorular s){int i=s.dogrucevap;}
,有什么问题吗?@Brian:如果不实现IEnumerable@PierreOverFlow-
soru
是一个数组。它实现了IEnumerable。@TravisJ:我没有看到问题的第一行,是的,你说得很对“sorular.dogrucevap”在foreach循环中没有任何意义,这是一个整数类型,不是一个迭代类型。Worked thx没有想到我这个迟钝的大脑:)我也会寻找反射thx来给出答案:)如果你能接受这个答案,那会很有帮助。thx Zachary我需要知道的是我有结构数组:)thx给所有帮助过我的人:)
foreach( int i in dogrucevaps )
{
   //TODO: use i
}
foreach(int i in soru.Select(s => s.dogrucevap))
{
   //TODO: use i    
}