C#“Clean”方式向用户显示数组(字典/表)

时间:2017-10-17 06:14:24

标签: c# dictionary

我的问题是我从数据库中获取条目并希望显示它们。我在字典的帮助下循环遍历行:

foreach (Dictionary<string, string> row in database)
{
    Console.WriteLine(row["column_1"]);
    Console.WriteLine(row["column_2"]);
    Console.WriteLine(row["column_3"]);
    Console.WriteLine(row["column_4"]);
}

我知道可以使用GUI GridViewer进行显示,但我不想仅为此目的切换到Windows窗体应用程序。

有没有办法将其显示为格式化文本或类似内容,如果他愿意,可以由用户复制?

4 个答案:

答案 0 :(得分:2)

您可以使用LINQ的Selectstring.join的组合,在一行代码中从字典生成格式化字符串:

var x = new Dictionary<string, string>() {{"a", "1"}, {"b", "2"}, {"c", "3"}};
Console.WriteLine(string.Join("\n", x.Select(kvp => $"{kvp.Key}\t{kvp.Value}")));

结果:

a    1
b    2
c    3

You can see a live demo on rextester.

从您的评论中,您似乎想要显示数据表,因为字典每个键只有一个值。 这是我原始代码的改编:

var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("val1", typeof(int));
dt.Columns.Add("val2", typeof(string));

dt.Rows.Add(1, 1, "a");
dt.Rows.Add(2, 20, "b");
dt.Rows.Add(3, 300, "c");
dt.Rows.Add(4, 4000, "d");

Console.WriteLine(string.Join("\n", dt.Select().Select(row => string.Format("{0}\t{1}\t{2}", row["Id"], row["val1"], row["val2"]))));

请注意,DataTable的Select()方法不是LINQ扩展方法,而是选择数据行数组的方法。在那个数组上,我正在使用LINQ的Select扩展方法。

答案 1 :(得分:1)

如果您使用的是WPF项目,我会选择DataGrid:

XAML:

<DataGrid AutoGenerateColumns="True"
          ItemsSource="{Binding YOUR_DICTIONARY}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Key_Header" Binding="{Binding Key}" />
            <DataGridTextColumn Header="Value_Header" Binding="{Binding Value}" />
        </DataGrid.Columns>
</DataGrid>

答案 2 :(得分:0)

为什么不使用Json.NET - Newtonsoft将字典序列化为JSON,输出将为:{a:1,b:2}或[{a:1,b:2},{c:1,d :2}]表示数组

答案 3 :(得分:0)

要在控制台(或几乎没有变化的文件)上显示一些“更好”的显示,您可以试试这个。首先获取每个的最大长度,例如:

var sizes = database.SelectMany(x => x)
  .GroupBy(x => x.Key, y => y.Value.Length)
  .ToDictionary(x => x.Key, y => y.Max());

(我假设database实现了IEnumerable<Dictionary<string, string>。)

现在您可以显示标题行:

foreach (var size in sizes)
{
  Console.Write(size.Key.PadLeft(size.Value));
  Console.Write(" ");
}
Console.WriteLine();

然后显示每一行:

foreach (var row in list)
{
  foreach (var column in row)
  {
    var padding = sizes[column.Key];
    Console.Write(column.Value.PadLeft(padding));
    Console.Write(" ");
  }
  Console.WriteLine();
}

PadLeft left 侧填充带有空格(或使用重载时的任何其他字符)的字符串,因此字符串右对齐。对于左对齐,请使用PadRight

请注意,字典中条目的顺序是任意的。所以你可能想要自己应用一些特定的订单。