使用C#限制打印在一行上的项目数

时间:2015-10-29 02:10:21

标签: c# arrays printing

我刚刚学习C#。我有以下两种打印字节数组内容的方法。但我不知道如何将每行的字节数限制为16:

foreach (byte i in buffer)
{
    Console.Write("{0:X2} ", i);
}
Console.WriteLine("\n");
Console.WriteLine(string.Join(" ", buffer.Select(b => b.ToString("X2"))));

我可以使用上述任何一种方法来完成这项工作。有人可以给我一个方法或其他方法的建议。

4 个答案:

答案 0 :(得分:3)

这个怎么样?

for(int i = 0; i < buffer.Length; i++)
{
    Console.Write("{0:X2} ", buffer[i]);
    if((i + 1) % 16 == 0) {
        Console.WriteLine();
    }
}

答案 1 :(得分:2)

您可以使用Take()扩展方法从字节数组中取出最多16个字节。

using System.Linq;

foreach (byte i in buffer.Take(16))
{
    Console.Write("{0:X2} ", i);
}

传统的方法是使用for循环,例如

int take = Math.Min(buffer.Length, 16);
for (int i = 0; i < take; i++)
{
    Console.Write("{0:X2} ", buffer[i]);
}

<强>更新

如果要编写所有缓冲区,但每行只有16个字节(最多),请使用MoreLinq Batch()方法。

using MoreLinq; // Install via NuGet

foreach (byte[] line in buffer.Batch(16))
{
    foreach (byte i in line)
        Console.WriteLine("{0:X2} ", i);

    Console.WriteLine();
}

答案 2 :(得分:1)

使用for循环可以采取16步:

for (int i = 0; i < bytes.Length; i += 16)
{
    Console.WriteLine(BitConverter.ToString(bytes, i, Math.Min(16, bytes.Length - i)));
}

如果需要单独打印每个字节,请使用正常步长为1的内循环。

答案 3 :(得分:0)

这是另一种方法:

var counter = 0;
var capacity = 16;
var str = string.Concat(buffer.Select(s =>
{
    counter++;

    var temp = string.Format("{0:X2}", s);

    if (counter < buffer.Length)
    {
        temp += ", ";
    }

    if (counter % capacity == 0)
    {
        temp += "\n";
    }

    return temp;
}));

Console.WriteLine(str);