我有一个二维数组,
string[,] table = {
{ "aa", "aaa" },
{ "bb", "bbb" }
};
而且我想像这样通过它,
foreach (string[] row in table)
{
Console.WriteLine(row[0] + " " + row[1]);
}
但是,我得到错误:
无法将类型字符串转换为字符串[]
有没有办法可以实现我想要的,即用迭代器变量迭代数组的第一个维度,返回该行的一维数组?
12 回答
如果你这样定义你的数组:
然后你可以在它上面使用foreach循环 .
这取决于您如何定义多维数组 . 这有两个选择:
正如其他人所建议的那样,您可以使用嵌套的for循环或将多维数组重新声明为锯齿状的数组 .
但是,我认为值得指出的是,多维数组是可枚举的,只是不是你想要的方式 . 例如:
请记住,多维数组就像一个表 . 每个条目都没有x元素和y元素;你有一个字符串(例如)
table[1,2]
.因此,每个条目仍然只有一个字符串(在您的示例中),它只是特定x / y值的条目 . 因此,要在
table[1, x]
处获取两个条目,您将执行嵌套for循环 . 类似下面的内容(未测试,但应该关闭)多维数组不可枚举 . 只需迭代这种老式的方式:
我试试这个 . 我希望能帮到你 . 它适用于
由于涉及内存使用,我不是这种方法的忠实粉丝,但是如果你使用它产生的数组,那就不是浪费了 .
执行:
我发现的另一个解决方案是内存密集度较低,但会使用更多的CPU,尤其是当数组条目的维度较大时 .
执行:
总的来说,我发现第一个选项更直观,特别是如果你想通过它的索引器访问生成的数组 .
在一天结束时,这只是眼睛糖果,这两种方法都不应该用于直接访问源数组;
使用LINQ你可以这样做:
这样,通过在GroupBy中使用Index2而不是Index1,也可以使用foreach循环遍历列而不是行 . 如果您不知道数组的维度,那么您必须使用GetLength()确定维度并在商中使用该值的方法 .
UPDATE :我有一些时间在我手上,所以......我继续前进并充实了这个想法 . 请参阅下面的代码 .
这是一个疯狂的答案:
你可以做你正在寻找的东西 - 基本上将二维数组视为一个带有行的表 - 通过编写一个静态方法(可能是一个扩展方法),它采用
T[,]
并返回一个IEnumerable<T[]>
. 但是,这需要将基础表的每个"row"复制到一个新数组中 .一个或许更好(虽然更复杂)的方法是实际编写一个实现
IList<T>
的类作为二维数组的单个"row"的包装器(您可能将IsReadOnly
设置为true并且只为this[int]
属性实现getter并且可能Count
和GetEnumerator
;其他一切都可以抛出NotSupportedException
) . 然后,您的静态/扩展方法可以返回IEnumerable<IList<T>>
并提供延迟执行 .这样你就可以像编写的那样编写代码:
只是一个想法 .
实施建议:
...现在我想我应该在剩下的时间里给StackOverflow一个休息时间;)
这是一个简单的扩展方法,它将每一行作为
IEnumerable<T>
返回 . 这样做的好处是不使用任何额外的内存:样品用法: