我的问题是我从数据库中获取条目并希望显示它们。我在字典的帮助下循环遍历行:
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窗体应用程序。
有没有办法将其显示为格式化文本或类似内容,如果他愿意,可以由用户复制?
答案 0 :(得分:2)
您可以使用LINQ的Select
和string.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
。
请注意,字典中条目的顺序是任意的。所以你可能想要自己应用一些特定的订单。