Ниже приведен класс
public class ErrorDTO
{
public string Type { get; set; }
public string Data { get; set; }
}
У меня есть список ErrorDTO, т.е. List<ErrorDTO>
Ниже приведены данные
Type1 x
Type1 y
Type2 z
Type3 p
Type2 q
и так далее....
Я хочу показать это в DataGrid для xaml следующим образом
Type1 Type2 Type3
x z p
y q
Как я могу это сделать? Я попытался преобразовать список в datatable, но не повезло. invalidDataList - это List<ErrorDTO>
var r = invalidDataList
.Distinct()
.GroupBy(x => x.Type)
.Select(y => new { Type = y.Key, Data = y });
DataTable table = new DataTable();
foreach (var item in r)
{
table.Columns.Add(item.Type, typeof(string));
foreach (var i in item.Data)
{
DataRow dr = table.NewRow();
dr[item.Type] = i.Data;
table.Rows.Add(dr);
}
}
dataGrid.ItemsSource = table.AsEnumerable();
хорошо, как насчет,
var typed = invalidDataList
.GroupBy(d => d.Type)
.Select(g => new
{
Type = g.Key,
Data = g.Select(d => d.Data).ToList()
})
.ToList();
var table = new DataTable();
foreach(var type In typed)
{
table.Columns.Add(type.Type);
}
var maxCount = typed.Max(t => t.Data.Count);
for(var i = 0; i < maxCount; i++)
{
var row = table.NewRow();
foreach(var type in typed)
{
if (type.Data.Count > i)
{
row[type.Type] = type.Data[i]
}
}
table.Rows.Add(row);
}
Следующий код должен помочь вам:
lst.GroupBy (l => l.Type).Select (l => new {
Type1 = l.Where (x => x.Type == "Type1").Select (x => x.Data),
Type2 = l.Where (x => x.Type == "Type2").Select (x => x.Data),
Type3 = l.Where (x => x.Type == "Type3").Select (x => x.Data)
});
Для сводной таблицы, в случае, если вы не знаете, сколько типов внутри списка, я думаю, самое простое решение, чтобы проверить первый отчетливые типы мы имеем в lst
списка:
var types = lst.Select (l => l.Type).Distinct().OrderBy (l => l).ToList();
а затем используйте DataTable:
var dt = new DataTable("Test");
DataRow workRow;
for (int i = 0; i < types.Count; i++)
{
dt.Columns.Add(types[i]);
var dataToInsert = lst.Where (l => l.Type == types[i]).Select (l => l.Data).ToList();
foreach (var element in dataToInsert)
{
workRow = dt.NewRow();
workRow[types[i]] = element;
dt.Rows.Add(workRow);
}
}