C # Создание вложенных словарей из списка

Мне удалось вывести следующие данные из базы данных в List<> с помощью Entity Framework.

id      Variable        Value   Coef
--------------------------------------
1000    Gender          Male     0
1001    Gender          Female  -0.205
1009    College Code    AT      -1.732
1010    College Code    BU      -1.806
1011    College Code    EH      -1.728
1012    College Code    EN      -2.003
1013    College Code    LF      -1.779
1014    College Code    pp      -2.042
1015    College Code    SC      -2.070
1016    College Code    UC      -1.845
1017    AGI             AGI N/A  0.236
1018    AGI             0       -0.684

Я немного новичок в C #, поэтому я хотел знать, что было бы лучшим способом создания вложенного Dictionary со следующим форматом:

//to construct a dictionary to hold Dictionary<Variable, {Value, Coef}>
Dictionary<string, Dictionary<string, double>> data = Dictionary<string, Dictionary<string, double>>();

Так, например, я мог получить доступ к следующим данным:

Console.WriteLine(data['Gender']['Male']) //returns 0
Console.WriteLine(data['College Code']['LF']) //returns -1.779

Всего 3 ответа


var data = _dbContext.Tbl.ToDictionary(_ => _.Variable + "=" + _.Value, _ => _.Coef, StringComparer.OrdinalIgnoreCase);

С данными, которые вы показали, нет необходимости группировать, просто создайте составной ключ и укажите значение. Я также рекомендую использовать нечувствительный к регистру ключ.

Таким образом, вы должны получить доступ к данным таким образом, чтобы College Code=LF был ключевым.

Console.WriteLine(data["College Code=LF"]);

Используя некоторые исходные данные следующим образом

public class data
{
    public int id { get; set; }
    public string Variable { get; set; }
    public string Value { get; set; }
    public decimal Coef { get; set; }
}

var listy = new List<data>() {
    new data() { id=1000, Variable="Gender", Value="Male", Coef=0m },
    new data() { id=1001, Variable="Gender", Value="Female", Coef=-0.205m },
    new data() { id=1009, Variable="College Code", Value="AT", Coef=-1.732m },
    new data() { id=1010, Variable="College Code", Value="BU", Coef=-1.806m },
    new data() { id=1011, Variable="College Code", Value="EH", Coef=-1.728m },
    new data() { id=1012, Variable="College Code", Value="EN", Coef=-2.003m },
    new data() { id=1013, Variable="College Code", Value="LF", Coef=-1.779m },
    new data() { id=1014, Variable="College Code", Value="pp", Coef=-2.042m },
    new data() { id=1015, Variable="College Code", Value="SC", Coef=-2.070m },
    new data() { id=1016, Variable="College Code", Value="UC", Coef=-1.845m },
    new data() { id=1017, Variable="AGI", Value="AGI N/A", Coef=0.236m },
    new data() { id=1018, Variable="AGI", Value="0", Coef=-0.684m },
};

Получите отдельный список полей Variable, чтобы засеять внешний словарь, затем найти связанные элементы в источнике данных и создать внутренний словарь для тех:

var b = listy
    .Select(x => x.Variable)
    .Distinct()
    // outer dictionary, key is Variable
    .ToDictionary(k => k, v => 
        listy
        // find items in the list with the same Variable
        .Where(x => x.Variable == v)
        // and create a dictionary for the Value/Coef pairs.
        .ToDictionary(k2 => k2.Value, v2 => v2.Coef));

Некоторый интерактивный вывод оболочки:

 > b["AGI"] Dictionary<string, decimal>(2) { { "AGI N/A", 0.236 }, { "0", -0.684 } } > b["AGI"]["0"] -0.684 > b["College Code"]["AT"] -1.732 > b["College Code"]["BU"] -1.806 

Учитывая коллекцию даты, вы должны иметь возможность получить нужные результаты.

var lookup = data.GroupBy(x => x.Variable)
    .ToDictionary(g => g.Key, g.ToDictionary(y => y.Value, y => y.Coef));

Обратите внимание, что это не сработает, если в столбцах Variable и Value есть несколько элементов с одинаковыми значениями.


Есть идеи?

10000