2012-10-16 48 views
1

我想通过Name,LastName在Datatable中进行分组,其余的应该在同一行中。有人可以帮我吗?DataTable组的结果

我的数据表:

Name LastName 1 3 2 
kiki ha   FF 
lola mi    AA 
ka  xe     UU 
kiki ha     SS 

我想通过名字有数据表组:

Name LastName 1 3  2 
kiki ha  FF   SS 
lola mi    AA 
ka  xe     UU 

我的新代码:

var result11 = from t1 in newtable.AsEnumerable() 
       group t1 by new { Name = t1.Field<String>("Name"), LastName = t1.Field<String>("LastName") } into grp 
       select new 
       { 
        Name = grp.Key.Name, 
        LastName = grp.Key.LastName, 

        //Something must be there  
       }; 
+0

如果会有冲突怎么办?如果第1列将具有相同姓名和姓氏的多行中的值? –

+0

不,在我的表格列1,3和2将只有一个相同的名称和姓氏像这样的表,不会是冲突。请把“我的数据表”作为固定表 –

回答

2

添加而不是注释这些行(//something must be there ):

C1 = String.Join(",", grp.Select(r=>r.Field<String>("1"))), 
C2 = String.Join(",", grp.Select(r=>r.Field<String>("2"))), 
C3 = String.Join(",", grp.Select(r=>r.Field<String>("3"))) 

在输出上获得三个新列,这些列汇总来自列1,32的列的值。

如果您在某个组的某一列中有多个值,则所有值都将显示并用逗号分隔(,)。

如果您确信有每组列最多一个值,那么你可以简单地做:

C1 = grp.Max(r => r.Field<String>("1")), 
C3 = grp.Max(r => r.Field<String>("3")), 
C2 = grp.Max(r => r.Field<String>("2")) 
+0

谢谢,它工作的很好,只是我想要的方式:) –

+0

更多的问题之一:同样的例子,但如果我不知道我有多少colums?像1,3,2,4,8 ......我会怎么做呢? –

+0

在这种情况下,此方法不起作用,因为您不知道在输出(匿名)类型中需要多少列(属性)。请尝试输出到另一个“DataTable”。 – GolfWolf

1

如果你想有一个DataTable作为结果,这给你想要的结果:

var lastNameGroups = from row in table1.AsEnumerable() 
        group row by new { 
         Name= row.Field<String>("Name"), 
         LastName = row.Field<String>("LastName") 
        } into LastNameGroups 
        select LastNameGroups; 

var table2 = table1.Clone(); 
foreach (var lng in lastNameGroups) 
{ 
    var row = table2.Rows.Add(); 
    row.SetField("Name", lng.Key.Name); 
    row.SetField("LastName", lng.Key.LastName); 
    var ones = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("1"))); 
    if(ones.Any()) 
     row.SetField("1", ones.First().Field<String>("1")); 
    var twos = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("2"))); 
    if (twos.Any()) 
     row.SetField("2", twos.First().Field<String>("2")); 
    var threes = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("3"))); 
    if (threes.Any()) 
     row.SetField("3", threes.First().Field<String>("3")); 
} 
+0

谢谢蒂姆。完美的作品。但是,如果我不知道我有多少列?修复是名称,姓氏,但1,3,2,4,6,7 ...他们是来自ID列的值,我让他们ColumnName,代码应该是什么? –

+0

然后这个问题会得到不清楚的答案,哪种DataTable具有未知数量的列?你能给个例子吗? –

+0

@UniLe:请不要太改变你的问题。现在所有的答案都应该是不被接受/低估的,因为他们不再回答你现在的问题。相反,问另一个问题。 –