Как создать столбец Total и строку Total, используя LINQ? - PullRequest
1 голос
/ 08 апреля 2011

Учитывая данные, которые не имеют общего столбца или строки.Как я могу использовать LINQ, чтобы добавить итоговый столбец и итоговую строку для создания таблицы ниже?

TextColumn, NumberColumn0, NumberColumn1 Total
A                1              4          5
B                2              55         47
C                2.3            DBNULL     2.3
D                4              3          7
Total            9.3            62         61.3

Спасибо!

Гм, для тех, кому нужен код.Я использую это в настоящее время для общего столбца:

public static void CreateTotalColumnByType(DataTable table, Type valueType)
{
    // create expression
    string expression = string.Empty;

    // do not count the first column (used for string field)
    for (int columnIndex = 1; columnIndex < table.Columns.Count; ++columnIndex)
    {
        if (columnIndex != table.Columns.Count - 1)
        {
            // add +
            expression += String.Format("[{0}] + ", table.Columns[columnIndex].ColumnName);
        }
        else
        {
            // last column so don't add plus
            expression += String.Format("[{0}]", table.Columns[columnIndex].ColumnName);
        }
    }

    // add total column
    DataColumn totalColumn = new DataColumn("Total", valueType, expression);
    table.Columns.Add(totalColumn);
}

, но я хотел бы заменить его на LINQ.

Ответы [ 3 ]

4 голосов
/ 08 апреля 2011
//adds Total column
var q1 = src.Select(x=>new { x.TextColumn
                            ,x.NumberColumn0
                            ,x.NumberColumn1
                            ,Total=x.NumberColumn0+x.NumberColumn1});

//adds Totals row
var q2 = q1.Concat(new[]{new{ TextColumn="Total"
                             ,NumberColumn0 = src.Sum(_=>_.NumberColumn0)
                             ,NumberColumn1 = src.Sum(_=>_.NumberColumn1)
                             ,Total=q1.Sum(_=>_.Total)}});
0 голосов
/ 11 августа 2014

Вы можете попробовать вот так.

For each col As DataGridViewColumn in grid.Columns
    '' You could try adding if here if there are exception columns
    gRID.Item(col.Index, 0).Value = gRID.Rows.Cast(Of DataGridViewRow)().AsEnumerable().Sum(Function(c) Convert.ToDecimal(c.Cells(col.Index).Value)).ToString()
Next

Я просто немного улучшил решение p.cambell

0 голосов
/ 08 апреля 2011

Есть несколько способов сделать это, в зависимости от того, как вы получаете это обратно, вам даже не нужно будет использовать LINQ.

Вы можете сделать следующее, если используете стандартные классы для передачи данных.

public class MyDataClass
{
    public string TextColumn {get; set;}
    public int NumberColumn0 {get; set;}
    public int NumberColumn1 {get; set;}
    public int Total
    {
        get { return NumberColumn0 + NumberColumn1; }
    }    
}

Таким образом, вам не нужно LINQ. Если вы ДЕЙСТВИТЕЛЬНО хотите использовать LINQ, вы можете использовать

var results = from x in MyDataList
              select new { TextColumn = x.TextColumn, NumberColumn0 = x.NumberColumn0, 
                           NumberColumn1 = x.NumberColumn1,
                           Total = x.NumberColumn1 + x.NumberColumn0};

Если у вас переменное число столбцов или что-то подобное, вам, возможно, не очень повезло бы с LINQ, нам нужно узнать больше, чтобы получить истинное представление о том, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...