Агрегировать набор данных - PullRequest
       13

Агрегировать набор данных

2 голосов
/ 13 августа 2010

Как мне агрегировать (используя linq) значение одного столбца набора данных, где другой столбец такой же.

Например, мои столбцы

Row1  Row2  

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

Мне нужночто-то вроде этого

Row1 Row2  

2    9  
4    5  
6    11  
7    4

edit: значения в «Row2» - это число «Row1».таким образом, значения (например: 2) должны быть агрегированы в новую таблицу данных, где есть только одна запись для (2). Извините, если вопрос расплывчатый.

Ответы [ 3 ]

5 голосов
/ 13 августа 2010

Вы можете использовать LINQ для агрегирования строк и копирования результатов в новую таблицу:

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 });
}
1 голос
/ 13 августа 2010

Добавить ссылку на 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"))
        };

Если вам нужна группа по нескольким столбцам:

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 голосов
/ 13 августа 2010

Если вы не хотите (не хотите) использовать Linq, вы можете попробовать this Microsoft HOWTO и создать свой собственный вспомогательный класс.

...