多维数组不实现IEnumerable,或者它们实现了吗?由于我仍然不明白的原因(参见这个SO问题),CLR中的多维数组没有实现IEnumerable。所以以下不编译:varm=newint[2,2]{{1,2},{3,4}};varq=fromeinmselecte;好的?SubMain()Dimm(,)AsInteger={{1,2},{3,4}}Dimq=FromeInmSelecteForEachiInqConsole.WriteLine(i)NextEndSub更新:以下代码之所以有效,是因为C#编译器将for循环替换为foreach以循环访问每个维度。foreach(vareinm)Console.WriteLine(e);改变int[,]numArray3=newint[,]{{2,2},{3,3}};intupperBound=numArray3.GetUpperBound(0);intnum4=numArray3.GetUpperBound(1);对于(inti=numArray3.GetLowerBound(0);i<=upperBound;i++){for(intj=numArray3.GetLowerBound(1);j<=num4;j++){intnum=numArray3[i,j];控制台.WriteLine(num);此查询在VB.Net中有效,因为它被转换为IEnumerableq=m.Cast().Select(o=>o);这是可行的,因为您可以在[*,*]实现IEnumerable上调用Cast()。LINQ查询在C#中不起作用,因为C#和VB.Net设计者采用了不同的方法。VB.Net采用更手持的方法并修复了您的错误并将IEnumerable转换为IEnumerable以便可以使用。在C#中,您可以使用varq=fromeinm.Cast()selecte;来模拟它。由于两个原因,他们没有在C#中本地实现它:Array的MSDN页面包括:重要说明:在.NETFramework2.0版,Array类实现System.Collections.Generic.IList、System.Collections.Generic.ICollection和System.Collections.Generic.IEnumerable泛型接口。这些实现是在运行时提供给数组的,请注意引号中的最后一个词……看起来这一代不会发生在多维数组中(所以文档是错误的)。但正如其他人所指出的那样,T会是什么?可以为T[](或者,现在使用LINQ,IEnumerable)做一个很好的例子。最后,如果您想遍历数组的所有成员,只需坚持使用IEnumerable和Cast扩展。否则很容易自己编写。提示:使用类型化范围变量而不是Cast()Samuel说:在C#中,您可以使用varq=fromeinm.Cast()selecte;来模拟它。//q是IEnumerable类型只是C#模拟VB当然是正确的,但是你丢失了你的类型信息。相反,它只是声明您的作用域变量,这样更简单且可读性更强。以下编译、执行更好、类型安全且不会丢失类型信息:varm=newint[2,2]{{1,2},{3,4}};varq=frominteinmselecte;//q是IEnumerable类型在最初的提案中,您将拥有一个IEnumerable,将inte更改为IEnumerable,这有其优点。以上是C#学习教程:Multidimensionalarraysdon’timplementIEnumerable,ordothey?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
