Вы можете попробовать использовать linq group by
и MAX
var query = myList
.GroupBy(c => c.Name)
.Select(g => new {
Name = g.Key,
_2018_11_01 = g.Where(c => c.Date == new DateTime(2018, 11, 1)).Max(c => c.Hour),
_2018_11_02 = g.Where(c => c.Date == new DateTime(2018, 11, 2)).Max(c => c.Hour)
});
Если вы хотите динамически создавать столбцы, вы можете попробовать написать лямбда-выражение в методе.
public static class ExtetionClass {
public static DataTable ToPivotTable<T, TColumn, TRow, TData>(
this IEnumerable<T> source,
Func<T, TColumn> columnSelector,
Expression<Func<T, TRow>> rowSelector,
Func<IEnumerable<T>, TData> dataSelector)
{
DataTable table = new DataTable();
var rowName = ((MemberExpression)rowSelector.Body).Member.Name;
table.Columns.Add(new DataColumn(rowName));
var columns = source.Select(columnSelector).Distinct();
foreach (var column in columns)
table.Columns.Add(new DataColumn(column.ToString()));
var rows = source.GroupBy(rowSelector.Compile())
.Select(rowGroup => new
{
Key = rowGroup.Key,
Values = columns.GroupJoin(
rowGroup,
c => c,
r => columnSelector(r),
(c, columnGroup) => dataSelector(columnGroup))
});
foreach (var row in rows)
{
var dataRow = table.NewRow();
var items = row.Values.Cast<object>().ToList();
items.Insert(0, row.Key);
dataRow.ItemArray = items.ToArray();
table.Rows.Add(dataRow);
}
return table;
}
}
используйте вот так
var pivotTable = myList.ToPivotTable(
item => item.Date,
item => item.Name,
items => items.Any() ? items.Max(x => x.Hour) : 0);
foreach (DataRow rw in pivotTable.Rows)
{
Console.WriteLine(string.Format("{0} {1} {2}", rw[0], rw[1], rw[2]));
}
c # online
Ram 7.0 7.5
Shyam 8.50 8.0
Ссылка
Преобразовать столбец в строку с помощью LINQ