【问题标题】:How to create Total column and Total row using LINQ?如何使用 LINQ 创建总计列和总计行?
【发布时间】:2014-08-11 16:50:17
【问题描述】:

给定一个没有总列或总行的数据表。如何使用 LINQ 添加 Total Column 和 Total 行来创建下表?

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 替换它。

【问题讨论】:

  • 您的数据源是什么样的?它是实体框架对象吗?数据表?对象的集合?显示一些代码!
  • 这是一个已经被填充的数据表。

标签: c# linq .net-4.0 datatable


【解决方案1】:
//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)}});

【讨论】:

  • 数字列的名称可以通过反射推导出来吗?我希望能够以更通用的方式使用它。
  • 为了使用匿名类型,您需要硬编码属性名称。
  • 呃,这似乎非常有限
  • 您也许可以构建一个新的 DataRow 而不是匿名类型?
  • 最后它必须是总行的数据行,总列的数据列,匿名类型不会与数据表一起飞行。
【解决方案2】:

有很多方法可以做到这一点,具体取决于您如何取回它,您甚至不需要使用 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 可能没有那么幸运,我们需要查看更多内容才能真正了解您在做什么。

【讨论】:

  • 这和数据表无关吧?
  • 当回答说没有详细信息时,可以将其转换为与数据表一起使用。
【解决方案3】:

你可以试试这个。

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

I just enhance p.cambell's solution a bit

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2015-06-29
    • 1970-01-01
    • 2022-10-13
    • 2022-12-31
    • 1970-01-01
    • 2012-04-30
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多