Как преобразовать словарь (с массивом как значение) в список в С#

61
7

Мне нужно преобразовать dictionary в list чтобы я мог привязать его к сетке.

В моем dictionary есть string как ключ, а array doubles как значение.

Я могу преобразовать dictionary в list с помощью функции ToList<> в dictionary, но когда я привязываю его к сетке, array отображается как объект в столбце сетки.

Как я могу добавить значения в array doubles в list? Есть ли способ извлечь значения array в список одновременно с преобразованием dictionary в list?

Это то, что я сейчас делаю:

List<KeyValuePair<string, double[]>> dataList = 
dataDictionary.ToList<KeyValuePair<string, double[]>>();

Мне нужно сохранить string и оба double значения в array (массив удвоений имеет размер два) для отображения в сетке.

Я посмотрел на это, но не смог реализовать его для того, что мне нужно: конвертировать словарь в список <KeyValuePair>

Любые предложения или помощь будут очень признательны.

Заранее спасибо,

Марван

PS - Я также думал о преобразовании dictionary в datatable чтобы я мог привязать его к сетке, но я не уверен, что это выполнимо.

спросил(а) 2021-01-27T23:58:16+03:00 1 месяц назад
1
Решение
85

IList<double> list = dictionary.SelectMany(item => item.Value).ToList();

Мне нужно сохранить строку и оба двойных значения в массиве (массив удвоений имеет размер два) для отображения в сетке.

Вы должны реализовать дополнительную логику, которая будет перебирать array по представлению. Также вы можете создать Tuple<string,double,double> и вручную привязать 2 double значения.

            Func<double[], int, double?> safeGet = (array, index) => array.Length - 1 >= index ? (double?)array[index] : null;
var list = dataList.Select(item => Tuple.Create(item.Key, safeGet(item.Value, 0), safeGet(item.Value, 1))).ToList();

ответил(а) 2021-01-27T23:58:16+03:00 1 месяц назад
74

Словарь в список

    Dictionary<string, double[]> dict = new Dictionary<string, double[]>();
dict.Add("1", new double[] { 1.10, 1.20 });
dict.Add("2", new double[] { 2.10, 2.20 });
dict.Add("3", new double[] { 3.10, 3.20 });
dict.Add("4", new double[] { 4.10, 4.20 });
dict.Add("5", new double[] { 5.10, 5.20 });

var lstRecord = dict.Select(i => new { Key = i.Key, Val1 = i.Value[0], Val2 = i.Value[1] }).ToList();
dataGridView1.DataSource = lstRecord;

Словарь к Datatable

        private void button1_Click(object sender, EventArgs e)
{
Dictionary<string, double[]> dict = new Dictionary<string, double[]>();
dict.Add("1", new double[] { 1.10, 1.20 });
dict.Add("2", new double[] { 2.10, 2.20 });
dict.Add("3", new double[] { 3.10, 3.20 });
dict.Add("4", new double[] { 4.10, 4.20 });
dict.Add("5", new double[] { 5.10, 5.20 });

dataGridView1.DataSource = Dictionary2Table(dict);
}

public DataTable Dictionary2Table(Dictionary<string, double[]> dict)
{
DataTable dt = new DataTable();
dt.Columns.Add("key", typeof(string));
dt.Columns.Add("Value1", typeof(double));
dt.Columns.Add("Value2", typeof(double));
dict
.Select(i => new { Key = i.Key, Val1 = i.Value[0], Val2 = i.Value[1] })
.ToList()
.ForEach(i=>dt.Rows.Add(i.Key,i.Val1,i.Val2));
return dt;
}

Надеюсь это поможет

ответил(а) 2021-01-27T23:58:16+03:00 1 месяц назад
61

Как насчет этого

public class HelperClass
{
private readonly KeyValuePair<string, double[]> Item;

[Bindable]
public string Key { get { return Item.Key; } }

[Bindable]
public double Value1 {get { return Item.Value[0]; } }

[Bindable]
public double Value2 {get { return Item.Value[1]; } }

public HelperClass(KeyValuePair<string, double[]> item)
{
this.Item = item;
}
}

public List<HelperClass> Convert(Dictionary<string, double[]> items)
{
var result = new List<HelperClass>(items.Count);
foreach(var item in items)
result.Add(new HelperClass(item));
return result;
}

Теперь вы можете привязать свою сетку к List<HelperClass>

ответил(а) 2021-01-27T23:58:16+03:00 1 месяц назад
61

Вы можете использовать Tuple для этого:

var result = dataDictionary.Select(x => Tuple.Create(x.Key, x.Value[0], x.Value[1]))
.ToList();

ответил(а) 2021-01-27T23:58:16+03:00 1 месяц назад
61

Попробуй это:

    Dictionary<string, double[]> dict = new Dictionary<string, double[]>()
{
{"a",new double[]{1,2}},
{"b",new double[]{3,4}}
};
List<Tuple<string, double, double>> list = dict.Select(kvp => Tuple.Create(kvp.Key, kvp.Value[0], kvp.Value[1])).ToList();

ответил(а) 2021-01-27T23:58:16+03:00 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема