2017-10-17 46 views
0

我的问题是,我得到来自数据库的条目并想显示它们。我通过行循环借助字典的帮助:C#“干净”的方式来显示阵列(词典/表)的用户

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窗体应用程序只是为了这个目的。

是否有办法来显示这是格式化的文本或任何类似的,可能由用户,如果他愿意这样做复制?

+1

为什么不输出到文件? Csv也许? – marsze

+2

你好,欢迎来到SO。我不明白你的问题。你在演示中使用什么? WPF? ASP?控制台应用? ...正在导出为CSV选项? – rmjoia

+0

JSON或XML怎么样? – Werner

回答

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扩展方法。

+0

我可以将格式扩展为多个字典条目吗?我基本上想保持标准数据库行格式。对于我的例子,我需要[{“Row1”,“Value1”,“Value2”,“Value3”,“Value4”},{“Row2”,“Value1”,“Value2”,“Value3”,“Value4” ,...] – GummiBoat

+0

字典只有一个键和值。似乎你想格式化一个'DataTable'。看到我编辑的答案。 –

+0

这是一个非常整洁的解决方案,谢谢! – GummiBoat

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> 
+0

很遗憾我正在使用一个控制台应用程序,我不知道如何实现这一点。不过谢谢你的建议。 – GummiBoat

+0

'的foreach(词典<字符串,字符串>在数据库的行) { \t的foreach(KeyValuePair <字符串,字符串>行KVP) \t { \t \t Console.WriteLine(“键为{0},值= { 1}“,kvp.Key,kvp.Value); \t} }' –

0

为什么不使用Json.NET - Newtonsoft将字典序列化为JSON,输出结果为:{a:1,b:2}或[{a:1,b:2},{c:1,d:2}对于一个阵列

+0

我喜欢将字典转换为JSON的想法,问题是它不是真正可读的,除非我再次将它转换为更具可读性的格式。 – GummiBoat

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填充用空格的字符串(或使用过载时的任何其他字符)上侧,因此字符串是正确的对齐。对于左对齐使用PadRight

要知道,条目在字典中的顺序是任意的。所以你可能想要自己申请一些特定的顺序。

相关问题