Транспонировать список <T> с помощью c #

1

Ниже приведен класс

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();
Теги:
linq

2 ответа

0
Лучший ответ

хорошо, как насчет,

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);
}
2

Следующий код должен помочь вам:

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);
    }
}
  • 0
    Что делать, если я не знаю, сколько типов, то есть Type1,2,3,4..etc, а также какие они
  • 0
    @ user3787610 Я обновил ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню