2014-09-02 187 views
1

下面是类移调列表<T>使用C#

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 

等等....

我想通过以下方式在xaml的DataGrid中显示它:

Type1 Type2 Type3 
x  z  p 
y  q  

我该怎么做?我试图将列表转换为数据表,但没有运气。 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(); 
+1

[关于与LINQ枢转堆叠的问题](http://stackoverflow.com/questions/18238046/trying-to-pivot-data-using LINQ)尝试搜索与LINQ的支点搜索 – RadioSpace 2014-09-02 23:02:13

+0

这可能有助于你http://stackoverflow.com/questions/320089/how-do-i-bind-a-wpf-datagrid-to-a-variable-number-列 – Seminda 2014-09-03 04:41:12

回答

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以及它们是什么 – user3787610 2014-09-11 18:41:25

+0

@ user3787610我更新了答案。 – 2014-09-12 13:02:35