Предполагая, что чтение CSV-файла не является проблемой, и у вас уже есть что-то вроде List<ClassName>
, DataTable
или List<string[]>
. Я предполагаю, что это List<String[]>
, где первая «колонка» - Date
, вторая Mount
и последняя %
в моем следующем подходе.
Вам нужно реальное DateTime
с и int
с, чтобы иметь возможность суммировать проценты по дате:
var formatProvider = new CultureInfo("de-DE"); // seems to be the correct format
var mountGroups = listOfStringArray
.Select(arr => new
{
Date = DateTime.Parse(arr[0].Trim(), formatProvider).Date,
Mount = arr[1].Trim(),
Percent = int.Parse(arr[2].Trim())
})
.GroupBy(x => x.Mount);
Теперь вы сгруппировали по Mount
, вам просто нужно суммировать проценты за каждый день. Вы можете использовать DataTable
в качестве источника данных для GridView
. Вот код, который создает таблицу с динамическими столбцами на каждый день:
var dataSource = new DataTable();
dataSource.Columns.Add("Mount");
var lastWeekColumns = Enumerable.Range(0, 7)
.Select(d => new DataColumn(DateTime.Today.AddDays(-6 + d).ToShortDateString(), typeof(int)))
.ToArray();
dataSource.Columns.AddRange(lastWeekColumns);
После цикла выполняет запрос LINQ и заполняет таблицу:
foreach(var grp in mountGroups)
{
DataRow row = dataSource.Rows.Add();
row.SetField("Mount", grp.Key); // because: GroupBy(x => x.Mount);
foreach(DataColumn dayCol in lastWeekColumns)
{
DateTime day = DateTime.Parse(dayCol.ColumnName, formatProvider);
int sumPercent = grp.Where(x => x.Date == day)
.Select(x => x.Percent)
.DefaultIfEmpty(0) // fallback value for missing days
.Sum();
row.SetField(dayCol, sumPercent);
}
}
Теперь вам просто нужно использовать его в качестве источника данных (AuthoGenerateColumns
установленное на true
)
grid.DataSource = dataSource;
grid.DataBind();
Как вы читаете CSV-файл? Это часть вашего вопроса или у вас уже есть что-то вроде 'List' или 'DataTable' или' List '? –
Я использую 'Sqldatasource' с' Odbc' без кода. – phe
Итак, вы хотите какой-то поворот, строки в столбцы? Известны ли дни? –