2012-10-16 10 views
1

Je veux regrouper dans Datatable par Nom, Nom et le reste doit être dans la même ligne. Quelqu'un peut-il m'aider avec?Groupe DataTable le résultat

Mon DataTable:

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

Je veux avoir un groupe DataTable par nom:

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

Mon nouveau code:

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

Et s'il y a conflit? Si la colonne 1 aura des valeurs dans plusieurs lignes avec le nom et le nom égaux? –

+0

non, dans ma colonne de table 1,3 et 2 aurait juste une valeur pour le même nom et nom de famille comme ce tableau, ne sera pas un conflit. S'il vous plaît prendre "My DataTable" comme table fixe –

Répondre

2

Ajouter ces lignes au lieu du commentaire (//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"))) 

pour obtenir trois nouvelles colonnes sur la sortie qui agrègent les valeurs des colonnes 1, 3 et 2.

Si vous avez plusieurs valeurs dans l'une des colonnes d'un groupe, toutes les valeurs seront affichées et séparées par une virgule (,).

Si vous êtes sûr qu'il ya au plus une valeur par colonne par groupe, alors vous pouvez simplement faire:

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

merci, cela fonctionne très bien, tout comme je le veux :) –

+0

une question de plus: le même exemple, mais si je ne sais pas combien de colonnes j'ai? comme 1,3,2,4,8 ... comment je le ferais? –

+0

Dans ce cas, cette approche ne fonctionne pas, car vous ne connaissez pas le nombre de colonnes (propriétés) dont vous avez besoin dans le type de sortie (anonyme). Essayez de sortir à un autre 'DataTable' à la place. – GolfWolf

1

Si vous voulez un DataTable comme résultat, cela donne le résultat souhaité:

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

merci Tim. Fonctionne parfaitement. Mais si je ne sais pas combien de colonnes j'ai? fix sont Name, LastName mais 1,3,2,4,6,7 ... ce sont des valeurs de ID Column, que je leur ai fait ColumnName, quel devrait être le code? –

+0

Ensuite, la question ne sera pas claire, quel type de DataTable a un nombre inconnu de colonnes? Pouvez-vous donner un exemple? –

+0

@UniLe: Veuillez ne pas changer votre question si fortement. Maintenant, toutes les réponses devraient avoir été rejetées/rejetées parce qu'elles ne répondent plus à votre question actuelle. Au lieu de poser une autre question. –

Questions connexes