给定一个没有总列或行的数据表。如何使用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替换它。
答案 0 :(得分:4)
//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)}});
答案 1 :(得分:0)
有很多方法可以做到这一点,取决于你如何获得这个,甚至不需要使用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可能没有那么多运气,我们需要了解更多以了解您正在做什么。
答案 2 :(得分:0)
你可以试试这个。
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