Добавить ключ в словарь динамически - PullRequest
0 голосов
/ 24 октября 2018

Ниже приведен код, в котором 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);
}

Теперь вместо жесткого кодирования клавиш типа ID, STATUS и т. Д. Яхочу добавить его из моего строкового массива, содержащего значения ниже

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

Как мне пройти arrNames, чтобы добавить ключи в словарь, а затем добавить List?

Ответы [ 5 ]

0 голосов
/ 24 октября 2018

Если вы предпочитаете LINQ-y и лаконичны, вы можете попробовать что-то вроде:

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

Здесь я предполагаю, что dt - это DataTable.

0 голосов
/ 24 октября 2018

Вы можете использовать метод 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)
    );
0 голосов
/ 24 октября 2018

Итерация по коллекции имен:

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);
}
0 голосов
/ 24 октября 2018

ваш код должен выглядеть примерно так

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);
  }
}
0 голосов
/ 24 октября 2018

Если в вашем массиве 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...