【问题标题】:While loop iteration displays strange tabulation虽然循环迭代显示奇怪的表格
【发布时间】:2022-01-15 23:12:25
【问题描述】:
    using (SqlDataReader myDataReader = myCommand.ExecuteReader())
            {
                //iterate loop results 
                while (myDataReader.Read())
                {
                    Console.WriteLine($"-> Make : {myDataReader["MakeId"]},\t " +
                        $"PetNAme : {myDataReader["PetName"]},\t" +
                        $" Color : {myDataReader["Color"]}.");

                }
            } 

输出 ++++++++ 数据阅读器的乐趣 AutoLot++++++++++++

-> Make : 1,     PetNAme : Zippy,        Color : Black.
-> Make : 2,     PetNAme : Rusty,        Color : Rust.
-> Make : 3,     PetNAme : Mel,  Color : Black.// <- this one |||||||||||
-> Make : 4,     PetNAme : Clunker,      Color : Yellow.
-> Make : 5,     PetNAme : Bimmer,       Color : Black.
-> Make : 5,     PetNAme : Hank,         Color : Green.
-> Make : 5,     PetNAme : Pinky,        Color : Pink.
-> Make : 6,     PetNAme : Pete,         Color : Black.
-> Make : 4,     PetNAme : Brownie,      Color : Brown.

虽然循环显示带有一个元素的奇怪列表,但您知道为什么会发生这种情况吗?

enter image description here

【问题讨论】:

  • 因为名称至少需要 4 个字符才能到达下一个制表位。请尝试调用“Mel”“Melanie”
  • 该字符串足够短,以至于下一个制表位比其他制表位更近。最好为每列使用固定宽度进行格式化。 stackoverflow.com/questions/644017/…
  • 欢迎来到 StackOverflow。如果答案解决了您的问题,请将其标记为可接受的答案。如果它帮助你给它一个upvote。如果答案离题或根本没有帮助,请投反对票或添加评论。另见stackoverflow.com/help/why-vote
  • 将值更改为:Melanie 成功了@Caius Jard
  • 这个关于标签的声明只在数据库中吗?因为使用 tab 的常规循环迭代工作得很好...... string[] array = { "a", "as", "asd", "asdf" }; for (int i = 0; i

标签: c# visual-studio


【解决方案1】:

首先查询最长的宠物名字,使用PadRight中的长度,如下图。更改服务器和表名以匹配您的数据库。

public static void Demo()
{
    using var cn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=ForumExample;Integrated Security=True");
    var sql = "SELECT LEN(PetName) +2 AS length FROM Pet WHERE LEN(PetName) = " + 
              "(SELECT MAX(LEN(PetName)) FROM Pet)";

    using var cmd = new SqlCommand(sql, cn);

    cn.Open();

    var nameLength = Convert.ToInt32(cmd.ExecuteScalar());
    cmd.CommandText = "SELECT MakeId, PetName, Color FROM dbo.Pet;";

    SqlDataReader reader = cmd.ExecuteReader();
    
    Debug.WriteLine("++++++++ Fun with Data Readers AutoLot++++++++++++");
    while (reader.Read())
    {
        Debug.WriteLine($"-> Make : {reader.GetInt32(0),-4}PetName : {reader.GetString(1).PadRight(nameLength)}Color : {reader.GetString(2)}");
    }

}

结果

++++++++ Fun with Data Readers AutoLot++++++++++++
-> Make : 1   PetName : Zippy    Color : Black
-> Make : 2   PetName : Rusty    Color : Rust
-> Make : 3   PetName : Mel      Color : Black
-> Make : 4   PetName : Clunker  Color : Yellow
-> Make : 5   PetName : Bimmer   Color : Black
-> Make : 6   PetName : Hank     Color : Green
-> Make : 7   PetName : Pinky    Color : Pink
-> Make : 8   PetName : Pete     Color : Black
-> Make : 9   PetName : Browie   Color : Brown

【讨论】:

  • 请注意,如果这样做是为了“制作固定宽度的报告”,我想我会选择一个宽度并使用它/截断超出限制的任何内容。如果远程机器正在使用报告,那么改变宽度可能会导致问题..(不是对答案的批评,更多的是对 OP/未来访问者的警告 - 如果您正在制作固定宽度的文件,请修复宽度。如果您正在制作分隔文件,请不要在控制台中显示它)
【解决方案2】:

\t 是一个制表符。一个制表符会将输出推进到下一个制表位。这正是每行输出发生的情况。

例如,打开文字处理器并输入:

this is some long text<tab><return>
this is more text<tab><return>
text<tab><return>

(在指示处使用实际的TabReturn。)注意Tab 字符在每一行上的作用。

为了解决这个问题,您可能会添加一些逻辑来根据字符串长度动态添加更多制表符,您可能会根据值的长度在它们之间构建带有空格的格式化字符串,或者您可能会输出到除具有更多格式化功能(GUI、Web 应用程序等)的控制台。

【讨论】:

  • 动态添加更多制表符,但当制表符大小不同时,这肯定会带来麻烦..
猜你喜欢
  • 2021-11-13
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
相关资源
最近更新 更多