С# LINQ - конвертировать вложенный словарь в список
Как сгладить вложенный словарь в список некоторых объектов (SomeObject
в следующем примере), который должен содержать ключи этих словарей?
Например: пусть есть словарь следующего типа
var nestedDictionary = new Dictionary<int, Dictionary<int, string>>();
то пусть этот класс
public class SomeObject
{
public int var1;
public int var2;
public string someStringVar;
}
Как преобразовать nestedDictionary
в List<SomeObject>
, где var1
- это ключ внешнего словаря, var2
- это ключ внутреннего словаря, а someStringVar
- строковое значение внутреннего словаря?
По существу, как мне передать это:
nestedDict[0][0] = "foo";
nestedDict[0][1] = "bar";
nestedDict[0][2] = "foo1";
nestedDict[1][0] = "bar1";
nestedDict[1][1] = "foo2";
nestedDict[1][2] = "bar2";
к этому (в псевдо С# просто для визуализации)
objList[0] = SomeObject { var1 = 0, var2 = 0, someStringVar = "foo" }
objList[1] = SomeObject { var1 = 0, var2 = 1, someStringVar = "bar" }
objList[2] = SomeObject { var1 = 0, var2 = 2, someStringVar = "foo1" }
objList[3] = SomeObject { var1 = 1, var2 = 0, someStringVar = "bar1" }
objList[4] = SomeObject { var1 = 1, var2 = 1, someStringVar = "foo2" }
objList[5] = SomeObject { var1 = 1, var2 = 2, someStringVar = "bar2" }
используя LINQ?
Ответы
Ответ 1
Это должно работать:
var flattened =
from kvpOuter in nestedDictionary
from kvpInner in kvpOuter.Value
select new SomeObject()
{
var1 = kvpOuter.Key,
var2 = kvpInner.Key,
someStringVar = kvpInner.Value
};
var list = flattened.ToList(); // if you need a list...
Ответ 2
Вы можете использовать SelectMany() и написать что-то вроде:
var objList = nestedDictionary.SelectMany(
pair => pair.Value.Select(
innerPair => new SomeObject() {
var1 = pair.Key,
var2 = innerPair.Key,
someStringVar = innerPair.Value
})).ToList();
Ответ 3
Это даст вам перечисление IEnumerable<SomeObject>
:
var results = from d in nestedDictionary
from innerD in d.Value
select new SomeObject { var1 = d.Key, var2 = innerD .Key, someStringVar = innerD .Value };
Вызовите results.ToList
или results.ToArray
, чтобы получить либо List<SomeObject>
, либо SomeObject[]
соответственно.
Ответ 4
var xxx = nestedDictionary.SelectMany(
kvp =>
kvp.Value.Select(
xx => new SomeObject() {var1 = kvp.Key, var2 = xx.Key, someStringVar = xx.Value}));