У меня есть сгруппированный объект, который выглядит как

Dictionary<(ushort id, ushort sc), Timepoint[]> timepoints

И это будет выглядеть так (1, 2) => [некоторые строковые временные точки]

Но я хочу преобразовать его в

Dictionary<ushort id, Timepoint[]>

И я хочу агрегировать этот sc и иметь только идентификатор. Я попытался:

test = timepoints.GroupBy(group => group.Key.id).ToDictionary(key => key.Key, value => value);

Но мне все не повезло.

Dictionary<ushort, IGrouping<ushort, KeyValuePair<(ushort id, ushort sc), Timepoint[]>>>

Я думаю, что что-то упускаю.

2
Wojciech Szabowicz 23 Окт 2018 в 14:14

2 ответа

Лучший ответ

Вам нужно использовать SelectMany, чтобы выровнять массивы, которые вы группируете вместе, и сначала превратить их в один массив.

var test = timepoints
    .GroupBy(kvp => kvp.Key.id)
    .Select(grp => new { grp.Key, Values = grp.SelectMany(x => x.Value).ToArray() })
    .ToDictionary(x => x.Key, x => x.Values);
3
juharr 23 Окт 2018 в 11:53

Расширенная и проверенная версия ответа @juharr;

timepoints
    .GroupBy(kvp => kvp.Key.id)
    .Select(grp => new { grp.Key, Values = grp.SelectMany(x => x.Value).ToArray() })
    .ToDictionary(x => x.Key, x => x.Values);

Вот полное тестовое консольное приложение, которое вы можете попробовать:

static void Main(string[] args)
{
    Dictionary<(ushort id, ushort sc), Timepoint[]> timepoints = new Dictionary<(ushort id, ushort sc), Timepoint[]>();
    timepoints.Add((1, 1), new Timepoint[] { new Timepoint(1, "1,1,1"), new Timepoint(1, "1,1,2"), new Timepoint(1, "1,1,3") });
    timepoints.Add((1, 2), new Timepoint[] { new Timepoint(1, "1,2,1"), new Timepoint(1, "1,2,2"), new Timepoint(1, "1,2,3") });
    timepoints.Add((2, 1), new Timepoint[] { new Timepoint(1, "2,1,1"), new Timepoint(1, "2,1,2"), new Timepoint(1, "2,1,3") });
    timepoints.Add((2, 2), new Timepoint[] { new Timepoint(1, "2,2,1"), new Timepoint(1, "2,2,2"), new Timepoint(1, "2,2,3") });
    var test = timepoints
                .GroupBy(kvp => kvp.Key.id)
                .Select(grp => new { grp.Key, Values = grp.SelectMany(x => x.Value).ToArray() })
                .ToDictionary(x => x.Key, x => x.Values);
}
class Timepoint
{
    public Timepoint(int id, string name)
    {
        this.Id = id;
        this.Name = name;
    }
    public int Id { get; set; }
    public string Name { get; set; }
}
1
Drag and Drop 23 Окт 2018 в 11:36
52947668