Я думал бы о нем этот путь:
Что-то как:
var groupedByCode = source.GroupBy(x => x.Code);
var groupedByCodeAndThenId = groupedByCode.Select(group =>
new { Key=group.Key, NestedGroup = group.ToLookup
(result => result.MktCode, result => result.Id));
var dictionary = groupedByCodeAndThenId.ToDictionary
(result => result.Key, result => result.NestedGroup);
, Который даст Вам Dictionary<Code, Lookup<MktCode, Id>>
- я думаю , это - то, что Вы хотите. Это полностью не тестируется все же.
Можно создать поиски (Виды Dictionary< List<>>) использование group by into
var lines = new []
{
new {Code = 1, MktCode = 10, Id = 1},
new {Code = 2, MktCode = 20, Id = 10},
new {Code = 1, MktCode = 10, Id = 12},
new {Code = 1, MktCode = 20, Id = 10},
new {Code = 1, MktCode = 20, Id = 14},
new {Code = 2, MktCode = 20, Id = 1},
new {Code = 2, MktCode = 30, Id = 2},
new {Code = 1, MktCode = 30, Id = 2},
new {Code = 1, MktCode = 30, Id = 5},
};
var groups = from line in lines
group line by line.Code
into codeGroup
select new
{
Code = codeGroup.Key,
Items = from l in codeGroup
group l by l.MktCode into mktCodeGroup
select new
{
MktCode = mktCodeGroup.Key,
Ids = from mktLine in mktCodeGroup
select mktLine.Id
}
};
Вот то, как я сделал бы это:
Dictionary<Code, Dictionary<MktCode, List<Id>>> myStructure =
myList
.GroupBy(e => e.Code)
.ToDictionary(
g => g.Key,
g => g
.GroupBy(e => e.Mktcode)
.ToDictionary(
g2 => g2.Key,
g2 => g2.Select(e => e.Id).ToList()
)
)
Вот разбивка процесса:
Группа элементы Кодом, и создают внешний словарь, где ключ является тем кодом.
myList
.GroupBy(e => e.Code)
.ToDictionary(
g => g.Key,
Для каждого из ключей во внешнем словаре, перегруппируйте элементы Mktcode и создайте внутренний словарь.
g => g
.GroupBy(e => e.Mktcode)
.ToDictionary(
g2 => g2.Key,
Для каждого из ключей во внутреннем словаре, спроектируйте идентификатор тех элементов и преобразуйте это в список.
g2 => g2.Select(e => e.Id).ToList()
)
)