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
}