Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ创建总计列和总计行?_C#_Linq_.net 4.0_Datatable - Fatal编程技术网

C# 如何使用LINQ创建总计列和总计行?

C# 如何使用LINQ创建总计列和总计行?,c#,linq,.net-4.0,datatable,C#,Linq,.net 4.0,Datatable,给定的datatable没有总计列或行。如何使用LINQ添加总计列和总计行以创建下表 TextColumn, NumberColumn0, NumberColumn1 Total A 1 4 5 B 2 55 47 C 2.3 DBNULL 2.3 D 4

给定的datatable没有总计列或行。如何使用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);
}
public static void CreateTotalColumnByType(DataTable表,类型valueType)
{
//创建表达式
字符串表达式=string.Empty;
//不计算第一列(用于字符串字段)
for(int columnIndex=1;columnIndex

但是我想用LINQ来代替它。

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

有很多方法可以做到这一点,取决于您如何取回这些列,您甚至不需要使用LINQ

//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)}});
如果使用标准类进行数据传输,则可以执行以下操作

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可能没有那么幸运,我们需要了解更多内容才能真正了解您正在做的事情。

您可以像这样尝试

//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)}});
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

你可以试试这个

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


您的数据源是什么样子的?它是实体框架对象吗?数据表?一组物品?显示一些代码!这是一个已经填充的数据表。您的数据源是什么样子的?它是实体框架对象吗?数据表?一组物品?显示一些代码!这是一个已经填充的datatable。这与datatables无关,是吗?当回答没有详细信息时,可以将其转换为使用数据表。这与datatables无关,是吗?可以将其转换为使用数据表,当回答时,细节不存在。数字列的名称可以通过反射得到吗?我希望能够以一种更通用的方式使用它。为了使用匿名类型,您需要硬编码属性名称。这似乎非常有限。您可以构建一个新的DataRow而不是匿名类型?最后,它必须是一个DataRow表示总计行,一个datacolumn表示总计列,匿名类型不会与datatable一起飞行。数字列的名称可以通过反射派生吗?我希望能够以一种更通用的方式使用它。为了使用匿名类型,您需要硬编码属性名称。这似乎非常有限。您可以构建一个新的DataRow而不是匿名类型?最后,它必须是一个DataRow表示总计行,一个datacolumn表示总计列,匿名类型不会与datatable一起运行。