【问题标题】:Add Key in Dictionary dynamically动态添加字典中的键
【发布时间】:2019-03-29 05:43:44
【问题描述】:

下面是key 被硬编码到Dictionary 中的代码

var datalist = new List<IDictionary<string, string>>();

for (var i = 0; i < dt.Rows.Count; ++i)
{
  var data = new Dictionary<string, string>()
  {
      { "ID",     Convert.ToString(dt.Rows[i]["ID"]) },
      { "STATUS", Convert.ToString(dt.Rows[i]["Name"]) },
      { "TYPE",   Convert.ToString(dt.Rows[i]["TYPE"]) }
  };

  datalist.Add(data);
}

现在,我不想硬编码IDSTATUS 等键,而是想从包含以下值的字符串数组中添加它

string[] arrNames = ConfigurationManager.AppSettings["NameKey"].Split(',');

如何遍历arrNames在字典中添加键,然后添加List

【问题讨论】:

  • 我不确定我是否理解这个问题。看来您需要使用 ToList() 和 ToDictionary() 方法:geekswithblogs.net/BlackRabbitCoder/archive/2010/10/21/… 如果我不理解您,请告诉我。
  • 似乎嵌套循环在您的未来。提示:Dictionary&lt;string, string&gt; 作为 Add(string key, string value) 方法。
  • 这取决于arrNames 的元素的外观。你可以做ToDictionary()
  • 你的字典键与DataTable的列不匹配,你怎么知道哪一列对应哪个字典键?使用索引还是....?
  • 假设您有一个名为key 的字符串变量。然后你可以使用data.Add(key, Convert.ToString(dt.Rows[i][key])); 这有帮助吗?您可以将该代码放在一个循环中 - 您不会像现在这样使用集合初始化程序。

标签: c# .net list dictionary


【解决方案1】:

遍历名称集合:

var datalist = new List<IDictionary<string, string>>();

string[] arrNames = ConfigurationManager.AppSettings["NameKey"].Split(',');

for (var i = 0; i < dt.Rows.Count; ++i)
{
    var data = new Dictionary<string, string>();

    foreach (var name in arrNames)
    {
        data[name] = Convert.ToString(dt.Rows[i][name]);
    }

    datalist.Add(data);
}

【讨论】:

    【解决方案2】:

    你的代码应该是这样的

    var datalist = new List<IDictionary<string, string>>();
    string[] arrNames = Convert.ToString(ConfigurationManager.AppSettings["NameKey"]).Split(',');
    
    if (arrNames.Length == 3)
    {
      for (var i = 0; i < dt.Rows.Count; ++i)
      {
        var data = new Dictionary<string, string>()
        {
            { arrNames[0], Convert.ToString(dt.Rows[i][arrNames[0]]) },
            { arrNames[1], Convert.ToString(dt.Rows[i][arrNames[1]]) },
            { arrNames[2], Convert.ToString(dt.Rows[i][arrNames[2]]) }
        };
    
         datalist.Add(data);
      }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 linq 方法ToDictionary。试试这个代码:

      string[] arrNames = // new[] {"ID", "STATUS", "TYPE"};
      
      var datalist = new List<IDictionary<string, string>>();
      for (var i = 0; i < dt.Rows.Count; ++i)
          datalist.Add(
              arrNames
                  .Select(key =>
                      new
                      {
                          key,
                          value = Convert.ToString(dt.Rows[i][key])
                      }
                  )
                  .ToDictionary(x => x.key, x => x.value)
          );
      

      【讨论】:

        【解决方案4】:

        如果您更喜欢 LINQ-y 且简洁,您可以尝试以下方法:

        var names = ConfigurationManager.AppSettings["NameKey"].Split(',');
        var list = dt.AsEnumerable()
                    .Select(r => names.ToDictionary(n => n, n => r[n]))
                    .ToList();
        

        这里我假设dtDataTable

        【讨论】:

          【解决方案5】:

          如果您的 arrNames 数组中的项目数至少与您要读取的列数相同,当然还有这个顺序,那么您可以硬核索引。

          var datalist = new List<IDictionary<string, string>>();
          
          for (var i = 0; i < dt.Rows.Count; ++i)
          {
            var data = new Dictionary<string, string>()
            {
                { arrNames[0], Convert.ToString(dt.Rows[i]["ID"]) },
                { arrNames[1], Convert.ToString(dt.Rows[i]["Name"]) },
                { arrNames[2], Convert.ToString(dt.Rows[i]["TYPE"]) }
            };
          
            datalist.Add(data);
          }
          

          【讨论】:

            猜你喜欢
            • 2023-03-08
            • 2019-11-21
            • 2011-11-04
            • 2023-03-20
            • 2020-05-30
            • 1970-01-01
            • 2016-10-29
            • 2014-10-13
            • 1970-01-01
            相关资源
            最近更新 更多