2012-10-16 116 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:請不要太改變你的問題。現在所有的答案都應該是不被接受/低估的,因爲他們不再回答你現在的問題。相反,問另一個問題。 –