2010-08-13 4 views
2

Comment agréger (en utilisant linq) la valeur d'une colonne d'un jeu de données où l'autre colonne est la même.Agréger un jeu de données

Par exemple, mes colonnes sont

Row1 Row2 

2  3 
4  5 
6  7 
2  2 
6  4 
7  4 
2  4 

je besoin de quelque chose comme ça

Row1 Row2 

2 9 
4 5 
6 11 
7 4 

modifier: les valeurs "Row2" sont le nombre de "Row1". donc les valeurs de (par exemple: 2) doivent être agrégées dans un nouveau datatable où est seulement une seule entrée pour (2). Je suis désolé si la question est vague.

+0

http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumSimple –

Répondre

5

Vous pouvez utiliser LINQ aux lignes globales et copier les résultats dans une nouvelle table:

DataTable source = // whatever 
DataTable dest = source.Clone(); 

var aggregate = source 
    .AsEnumerable() 
    .GroupBy(row => row.Field<int>("Row1")) 
    .Select(grp => new { Row1 = grp.Key, Row2 = grp.Select(r => r.Field<int>("Row2")).Sum() }); 

foreach(var row in aggregate) 
{ 
    dest.Rows.Add(new object[] { row.Row1, row.Row2 }); 
} 
+0

@ Sam, @Lee: Je recommande vivement d'utiliser 'IEnumerable .CopyToDataTable() où T: http DataRow' : //msdn.microsoft.com/en-us/library/bb396189.aspx – abatishchev

+0

J'ai utilisé cela. Merci – Sam

+0

Comment pouvons-nous refactoriser ce code pour le faire fonctionner pour N nombre de colonnes? – Karan

1

Ajouter référence à System.Data.DataSetExtensions.dll

DataSet ds = .. 
DataTable table = ds.Tables[0]; // or ds.Tables["YourTableName"]; 

var q = from row in table.AsEnumerable() 
     group row by row.Field<int>("Row1") into g 
     select new 
     { 
      Row1 = g.Key, 
      Row2 = g.Sum(s => s.Field<int>("Row2")) 
     }; 

Si vous avez besoin groupe de plusieurs colonnes:

var q = from record in table.AsEnumerable() 
     group record by new { Row1 = record.Field<int>("Row1"), Row2 = record.Field<int>("Row3") } into g 
     select new 
     { 
      Row1 = g.Key, 
      Row2 = g.Sum(s => s.Field<int>("Row2")) 
     }; 
+0

@abatishchev: Qu'est-ce que g.Key ici. Je regardais le lien fourni par moi et essayait de le comprendre. Pourriez-vous s'il vous plaît fournir quelques explications à ce sujet. –

+0

@Shantanu: 'g.Key' est une clé par laquelle vous groupez, dans le cas actuel -' row.Field ("Row1") ' – abatishchev

+0

@abatishchev: Que faire si j'avais 3 colonnes ou plus dans ce cas je a dû faire un groupe sur toutes les colonnes restantes. Dans ce cas, comment cela aurait-il fonctionné? –

0

Si vous ne voulez pas (utiliser) Linq, vous pouvez essayer this Microsoft HOWTO et créez votre propre classe d'assistance.

+0

Je dois utiliser linq! – Sam

Questions connexes