简体   繁体   中英

Add Key in Dictionary dynamically

Below is the code where key is being hard-coded in 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);
}

Now, instead of hard-coding the keys like ID , STATUS , etc, I want to add it from my string array containing the values below

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

How can I traverse arrNames to add keys in Dictionary and then add in List ?

Iterate through the collection of names:

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);
}

your code should look something like this

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);
  }
}

You can use linq method ToDictionary . Try this code:

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)
    );

If you prefer LINQ-y and concise you could try something like:

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

Here I'm assuming dt is a DataTable .

If you have at least the same number of items in your arrNames array than columns you want to read and of course with this order, then you can hardcore the indexes.

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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM