【问题标题】:Populate dataGridView with a list inside a dictionary?用字典中的列表填充 dataGridView?
【发布时间】:2019-02-21 06:41:25
【问题描述】:

我有一本这样的字典:

Dictionary<string, List<string>>

像这样添加键和值后:

resultDic.Add(s, new List<string>());
    foreach (DataRow row in schemaTable.Rows)
    {
     resultDic[s].Add(row[3].ToString());
    }

然后我想在字典中的列表中显示字符串值和单个值。为了实现这一点,我尝试这样做:

        dataGridView2.DataSource = Controller.GetMetaDataTables2().Select(x 
        => new { ColumnName = x.Key, Table = x.Value[0] }).ToList();
        dataGridView2.Show();

GetMetaDataTables2 返回一个与上面类似的字典。问题是 index [0] 显然只给了我第一个值,当我想显示整个列表时。我想迭代,但我不知道该怎么做。我刚刚开始理解 LINQ 表达式。有什么想法吗?

感谢所有帮助!

更新:在 Markus 的帮助下修复了它。我使用他的解决方案进行了一次更改。而不是 y.ToArray() 我需要简单地打印 y。像这样:

   dataGridView2.DataSource = Controller.GetMetaDataTables2()
   .SelectMany(x => x.Value.Select(y => new { ColumnName = x.Key, Table = 
   y }))
   .ToArray();
   dataGridView2.Show();

【问题讨论】:

  • 你想要的结果是什么?包含“Key A, Value A.1”、“Key A, Value A.2”、“Key B, Value B.1”等行的平面表?
  • 尝试以下使用字符串连接: Dictionary> dict = Controller.GetMetaDataTables2.AsEnumerable() .GroupBy(x => x.Field("ColA") , y => y.Field("ColB")) .ToDictionary(x => x.Key, y => y.ToList());var results = dict.Select(x => new { ColumnName = x.Key, Table = string.Join(",", x.Value) });
  • @Markus 是的,没错。
  • @jdweng 您的解决方案给了我这个错误: KeyValuePair>' 不包含'Field' 的定义和最佳扩展方法重载'DataRowExtensions.Field( DataRow, string)' 需要“DataRow”类型的接收器。我是否需要让 GetMetaDataTables 方法返回 DataRow?
  • 我假设你有 DataTables。所以代码正在寻找表中的列。如果您有一个类,则将 x.Field 替换为该类中的属性名称或匿名列名称。

标签: c# dictionary datagridview populate


【解决方案1】:

您可以使用SelectMany 方法来展平列表,例如:

resultDic
  .SelectMany(x => x.Value.Select(y => new { ColumnName = x.Key, Table = y.ToArray() }))
  .ToArray();

对于

A - “A.1”、“A.2”
B - “B.1”、“B.2”
C - “C.1”、“C.2”

这导致

A - A.1
A - A.2
B - B.1
B - B.2
C - C.1
C - C.2

为了在GridView中显示,代码应该是

dataGridView2.DataSource = Controller.GetMetaDataTables2()
  .SelectMany(x => x.Value.Select(y => new { ColumnName = x.Key, Table = y.ToArray() }))
  .ToArray();
dataGridView2.Show();

【讨论】:

  • 说数据源在调试器中为空。
  • @Heeiman 我添加了一个示例,该示例将代码与数据源的分配集成在一起。希望这会有所帮助。
  • 是的,我试过了。我需要在最后添加一个“)”(根据VS)。我是不是放错地方了?
  • @Heeiman 抱歉,忘记了。我在第二行添加了括号。
  • @Heeiman 我已成功将示例数据分配给 DataGridView。你能检查从GetMetaDataTables2开始逐步返回的值吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2018-03-27
  • 2014-01-02
相关资源
最近更新 更多