gpt4 book ai didi

c# - 在对其中一列求和时合并 N 个数据表

转载 作者:行者123 更新时间:2023-11-30 16:44:39 24 4
gpt4 key购买 nike

我有 N 个数据表,我需要将它们合并到一个数据表中,同时还要对所有表的“值”列求和。示例如下。

enter image description here

请注意:它可以是任何数量的要合并的表,而且字段是动态的,这意味着它不是必需的,只有“年”在那里,它可以是任何东西,但“值”列将始终存在,并且表格将具有相同的列。

最佳答案

我的快速解决方案可能看起来像这样......

public class Program
{
static void Main()
{
//make dummy data
List<DataTable> dts = new List<DataTable>();

Random rnd = new Random();
for (int i = 0; i < 20; i++)
{
var dt = new DataTable();

dt.Columns.Add("foo", typeof(int));
dt.Columns.Add("bar", typeof(int));
dt.Columns.Add("baz", typeof(int));
dt.Columns.Add("Value", typeof(int));

for (int j = 0; j < 1000; j++)
{
dt.Rows.Add(rnd.Next(1, 5), rnd.Next(1, 5), rnd.Next(1, 5), rnd.Next(1, 2000));
}
dts.Add(dt);
}

//dummy data complete

// the grouping step
var intermediateResult = dts.SelectMany(x => x.Rows.Cast<DataRow>()).GroupBy(x => x, new NotValueColumnComparer()).Select(x => new { grp = x.Key, sum = x.Sum(y => y.Field<int>("Value")) });


// transform back into a data tabe
var result = new DataTable();

foreach (var col in dts.First().Columns.Cast<DataColumn>())
{
result.Columns.Add(col.ColumnName);
}

foreach (var item in intermediateResult)
{
var row = result.NewRow();

foreach (var grpField in item.grp.Table.Columns.Cast<DataColumn>().Where(x => x.ColumnName != "Value"))
{
row[grpField.ColumnName] = item.grp[grpField.ColumnName];
}
row["Value"] = item.sum;

result.Rows.Add(row);
}
//transform end

}

//the class that does the trick
public class NotValueColumnComparer : IEqualityComparer<DataRow>
{
//compare all columns but the Value column
public bool Equals(DataRow x, DataRow y)
{
foreach (var col in x.Table.Columns.Cast<DataColumn>())
{
if (col.ColumnName != "Value")
if (x[col.ColumnName] != y[col.ColumnName])
return false;
}
return true;
}


//as a simple hash code ... just xor the values hash codes
public int GetHashCode(DataRow obj)
{
int res = 0;
foreach (var col in obj.Table.Columns.Cast<DataColumn>())
{
if (col.ColumnName != "Value")
res ^= obj[col].GetHashCode();
}
return res;
}
}
}

如果你不怕额外的库,你可能想看看 ad dynamic LINQ ...

关于c# - 在对其中一列求和时合并 N 个数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43252495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com