Преобразование DataTable в словарь с использованием Linq / Lambda - PullRequest
2 голосов
/ 25 апреля 2019

У меня есть DataTable, который я хотел бы преобразовать в словарь на C # для моего проекта.Я могу использовать традиционный способ программирования для достижения цели, но он не такой элегантный, как использование linq / lambda.Я пытался использовать Lambda, но застрял в том, как сгруппировать несколько строк в 1.

У меня есть фиктивный DataTable для целей тестирования.

static DataTable GetData()
{
    DataTable table = new DataTable();
    table.Columns.Add("Field1", typeof(string));
    table.Columns.Add("Field2", typeof(string));

    table.Rows.Add("A", "A1");
    table.Rows.Add("A", "A2");
    table.Rows.Add("B", "B1");
    table.Rows.Add("A", "A3");
    table.Rows.Add("C", "C1");
    table.Rows.Add("D", "D1");
    table.Rows.Add("A", "A5");

    return table;
}

Мой традиционный способ конвертировать его в словарьis:

    Dictionary<string, ArrayList> t = new Dictionary<string, ArrayList>();
    foreach (DataRow r in GetData().Rows)
    {
        string k = (string)r["Field1"];
        string v = (string)r["Field2"];
        if (!t.Keys.Contains(r["Field1"]))
        {
            t.Add(k, new ArrayList());
        }
        if (t.Values == null)
        {
            t[k] = new ArrayList();
        }
        t[k].Add(v);
    }

Как мне добиться того же самого с Linq?

Я пробовал:

var res = GetData()
                     .AsEnumerable()
                     .GroupBy(row => row.Field<string>("Field1"))
                     .Select(grp => grp.First());

Это только дает мне первое появление предмета,Я застрял.Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 25 апреля 2019

На самом деле, вы не хотите конвертировать его в словарь, а в Lookup. Вот пример:

var lookup = GetData().AsEnumerable()
    .ToLookup(r => r.Field<string>("Field1"), r => r.Field<string>("Field2"));
foreach (var grouping in lookup)
{
    Console.WriteLine(grouping.Key + ": " +  String.Join(", ", grouping));
}

Выход:

A: A1, A2, A3, A5
B: B1
C: C1
D: D1
0 голосов
/ 25 апреля 2019

Получение данных из Datatable в виде словаря без Linq / Lambda

        DataTable dataTable = GetData();
        var data = new List<Dictionary<string, object>>();
        foreach (DataRow dataTableRow in dataTable.Rows)
        {
            var dic = new Dictionary<string, object>();
            foreach (DataColumn tableColumn in dataTable.Columns)
            {
                dic.Add(tableColumn.ColumnName, dataTableRow[tableColumn]);
            }
            data.Add(dic);
        }

0 голосов
/ 25 апреля 2019

Вы можете получить коллекцию:

            var res = GetData()
                 .AsEnumerable()
                 .Select(grp => new KeyValuePair<string, string>(grp[0].ToString(), grp[1].ToString()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...