【问题标题】:Limit the number of items printed on a line using C#使用 C# 限制在一行上打印的项目数
【发布时间】:2016-01-29 00:54:38
【问题描述】:

我只是在学习 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"))));

我可以使用以上任何一种方法来完成这项工作。有人可以就其中一种方法给我一个建议吗?

【问题讨论】:

    标签: c# arrays printing


    【解决方案1】:

    这个怎么样?

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

    【讨论】:

    • 这应该是 "if ( (i + 1) % 16 == 0)" 否则它会在第一行放一个字节。
    • @user3389362 - 感谢您的评论。我已经更新了我的答案。干杯!
    【解决方案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();
    }
    

    【讨论】:

    • 是的,每行 16 个字节。
    • MoreLinq 似乎是我需要从外部源加载的东西。有没有办法只使用 Visual Studio 发行版来做到这一点?
    • NuGet 已完全集成到 Visual Studio 中。右键单击项目的引用,然后选择添加 NuGet 引用。 MoreLinq 非常有价值,值得了解(它也是由 StackOverflow 的主要贡献者 Jon Skeet 创建的)
    • 我正在使用 VS2015。我没有看到“添加 NuGet 引用”,但确实看到了“添加引用”,它导致了程序集->扩展-> NuGet.Core”,所以我这样做了,但在“使用 MoreLinq;”语句中得到了同样的错误。错误正在“错误 CS0246:找不到类型或命名空间名称'MoreLinq'(您是否缺少 using 指令或程序集引用?)”。我还看到“管理 NuGet 包”......所以我选择了它并安装了 NuGet .Core 但仍然出现错误。
    • 对不起,它叫做管理 Nuget 包。不在VS前面,凭记忆写了菜单项的名字。 docs.nuget.org/consume/package-manager-dialog
    【解决方案3】:

    使用 for 循环可以执行 16 步:

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

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

    【讨论】:

    • 这会在每个字节之间添加一个破折号,但我不明白为什么。
    • @user3389362 BitConverter.ToString 自动执行此操作。它将字节数组转换为文本表示(带破折号..)。
    【解决方案4】:

    这是另一种方法:

    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);
    

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      相关资源
      最近更新 更多