我有一个二维数组(array
),并尝试打印出(Console.WriteLine
)由分号;
分隔的元素。即有像
MyType[,] array = new MyType[,]
{
{item11, item12, item13},
{item21, item22, item23},
};
我正在寻找结果
item11;item12;item13
item21;item22;item23
我的尝试是:
for (int y = 0; y < (array.GetLength(0)); y++)
{
for (int x = 0; x <= 8; x++)
{
//--> This way it works however I get the final ;
// after the last element which I do not need
Console.Write(array[y, x] + ";");
//--> This way I get only semicolons and no array elements
Console.Write(String.Join(";", array));
}
Console.WriteLine('\r');
}
如何解决?
答案 0 :(得分:1)
尝试按项目打印项目(实际上,您不要连接这些项目,而是将它们输出到控制台):
for (int y = 0; y < array.GetLength(0); ++y) {
if (y > 0)
Console.WriteLine();
for (int x = 0; x < array.GetLength(1); ++x) {
if (x > 0)
Console.Write(";");
Console.Write(array[y, x]);
}
}
对于
int[,] array = new int[,] {
{ 1, 2, 3},
{ 4, 5, 6},
};
上面的代码打印出来
1;2;3
4;5;6
如果您想string
(稍后可以打印),请将Console
更改为StringBuilder
:
StringBuilder sb = new StringBuilder();
for (int y = 0; y < array.GetLength(0); ++y) {
if (y > 0)
sb.AppendLine();
for (int x = 0; x < array.GetLength(1); ++x) {
if (x > 0)
sb.Append(";");
sb.Append(array[y, x]);
}
}
string result = sb.ToString();
...
Console.Write(result);
旁注:请注意使用锯齿状数组([][]
而不是[,]
)更容易:只有两个Join
s :
Console.Write(string.Join(Environment.NewLine, array
.Select(line => string.Join(";", line))));
答案 1 :(得分:0)
如果您使用的是MoreLinq扩展程序,则可以使用a Batch
operator来简化此操作。这是available on NuGet。
使用Batch
运算符,解决方案如下所示:
using System;
using System.Linq;
using MoreLinq;
namespace Demo
{
class Program
{
static void Main()
{
int[,] array =
{
{ 0, 1, 2, 3 },
{ 4, 5, 6, 7 },
{ 8, 9, 10, 11 }
};
foreach (var row in array.Cast<int>().Batch(array.GetLength(1)))
{
Console.WriteLine(string.Join(";", row));
}
}
}
}
如果你想得到想象,你可以编写一个扩展方法来迭代二维数组的行(使用Batch()
):
public static class TwoDimensionalArrayExt
{
public static IEnumerable<IEnumerable<T>> Rows<T>(this T[,] array)
{
return array.Cast<T>().Batch(array.GetLength(1));
}
}
代码变得更具可读性:
foreach (var row in array.Rows())
{
Console.WriteLine(string.Join(";", row));
}