Если вы хотите, чтобы результатом был статически типизированный анонимный (или определенный класс) объект, вам нужно будет сделать что-то похожее на то, что вы делаете.
Я бы использовал расширенный тип словаря, преобразованный из каждой группы. чтобы упростить извлечение значений:
//***
// Enhanced Dictionary that returns default(TValue) for missing values
//***
public class NullDictionary<TKey, TValue> : Dictionary<TKey, TValue> {
public NullDictionary(IDictionary<TKey, TValue> d) : base() {
foreach (var kvp in d)
Add(kvp.Key, kvp.Value);
}
public NullDictionary() : base() { }
public new TValue this[TKey key]
{
get
{
TryGetValue(key, out var val);
return val;
}
set
{
base[key] = value;
}
}
}
С помощью метода расширения, упрощающего создание:
public static class DictExt {
public static NullDictionary<TKey, TValue> ToNullDictionary<T, TKey, TValue>(this IEnumerable<T> src, Func<T, TKey> keyFn, Func<T, TValue> valFn) {
var nd = new NullDictionary<TKey, TValue>();
foreach (var s in src)
nd.Add(keyFn(s), valFn(s));
return nd;
}
}
Теперь вы можете поворачивать данные с помощью GroupBy
и извлекать анонимные данные. объекты:
var ans = employeeHours.GroupBy(eh => new { eh.Id, eh.EmployeeName }, eh => new { Day = $"Day{eh.Day}", eh.Hours })
.Select(pg => {
var pd = pg.ToNullDictionary(p => p.Day, p => (int?)p.Hours);
return new {
pg.Key.Id,
pg.Key.EmployeeName,
Day1 = pd["Day1"],
Day2 = pd["Day2"],
Day3 = pd["Day3"],
Day4 = pd["Day4"],
Day5 = pd["Day5"],
Day6 = pd["Day6"],
Day7 = pd["Day7"],
};
})
.ToList();
Также можно использовать более динамический c объект, такой как DataTable
, или Dictionary
или ExpandoObject
для каждого члена списка, или даже для создания анонимный объект во время выполнения, хотя в большинстве случаев это сомнительная ценность, поскольку вы не можете легко получить доступ к его полям. Однако, если вы не знали, как могут быть возможны значения Day
, и хотите обрабатывать изменяющееся число, вы должны использовать одно из них или заменить вместо этого поля дня коллекцией некоторого вида (например, массив, список, или словарь).