【发布时间】:2009-04-06 15:06:43
【问题描述】:
由于我仍然不理解 (see this SO question) 的原因,CLR 中的多维数组没有实现 IEnumerable<T>。因此以下内容无法编译:
var m = new int[2,2] {{1, 2}, {3, 4}};
var q = from e in m select e;
那么为什么这个在 VB.NET 中可以正常工作?
Sub Main()
Dim m(,) As Integer = {{1, 2}, {3, 4}}
Dim q = From e In m Select e
For Each i In q
Console.WriteLine(i)
Next
End Sub
更新:
以下代码有效,因为 C# 编译器将 foreach 替换为 for 循环以遍历每个维度。
foreach(var e in m)
Console.WriteLine(e);
变成
int[,] numArray3 = new int[,] { { 2, 2 }, { 3, 3 } };
int upperBound = numArray3.GetUpperBound(0);
int num4 = numArray3.GetUpperBound(1);
for (int i = numArray3.GetLowerBound(0); i <= upperBound; i++)
{
for (int j = numArray3.GetLowerBound(1); j <= num4; j++)
{
int num = numArray3[i, j];
Console.WriteLine(num);
}
}
【问题讨论】:
-
foreach(...) 之所以有效,是因为 [,] 实现了 IEnumerable(非泛型),而查询需要 IEnumerable
。 -
有趣的是,Visual Studio 将 e 的类型显示为 int,而不是您在 IEnumerable 的情况下所期望的对象
-
另外,我想指出问题是“为什么它在 VB 中有效?”,而不是为什么它不在 C# 中实现
-
乔尔已回答您的问题。 [,] 没有实现 IEnumerable
,但它确实实现了 IEnumerable。您可以自己调用 GetEnumerator() 并伪装成 foreach 循环。 -
是的,我做到了,它在 VB.Net 中工作,因为它们对 LINQ 查询采取了略有不同的方法,它更倾向于握住程序员的手,并在幕后调用 IEnumerable.Cast