У меня есть сгруппированный объект, который выглядит как
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 ответа
Вам нужно использовать 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);
Расширенная и проверенная версия ответа @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; }
}
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.