ASP.NET C# 如何合并DataTable中的重复数据(做数据整合)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET C# 如何合并DataTable中的重复数据(做数据整合)相关的知识,希望对你有一定的参考价值。

现在我有一个DataTable,数据源的格式是这样的
品牌 物品 数量
联想 笔记本 2
联想 台式机 10
联想 笔记本 18
戴尔 笔记本 5

想得到这样的结果
品牌 物品 数量
联想 台式机 10
戴尔 笔记本 5
联想 笔记本 20

排序方式无所谓,求大神们指教!
方案是2.0的,没法用Linq、Lambda、var。

不要发SQL了,SQL的我也会。这些数据不是从数据库取的。

这样行不行

DataTable dt = new DataTable();
dt.Columns.Add("品牌");
dt.Columns.Add("物品");
dt.Columns.Add("数量");
DataRow dr = dt.NewRow();
dr[0] = "联想";
dr[1] = "笔记本";
dr[2] = "2";
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = "联想";
dr[1] = "台式机";
dr[2] = "10";
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = "联想";
dr[1] = "笔记本";
dr[2] = "18";
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = "戴尔";
dr[1] = "笔记本";
dr[2] = "5";
dt.Rows.Add(dr);

Dictionary<string, int> dic = new Dictionary<string, int>();
for (int i = 0; i < dt.Rows.Count; i++)

string name=dt.Rows[i][0].ToString() +"&"+ dt.Rows[i][1].ToString();
if (dic.ContainsKey(name))

dic[name]+=Convert.ToInt32(dt.Rows[i][2]);

else

dic.Add(name, Convert.ToInt32(dt.Rows[i][2]));




DataTable dt2 = dt.Copy();
dt2.Rows.Clear();
foreach (KeyValuePair<string, int> item in dic)

string[] name = item.Key.Split('&');
DataRow newdr = dt2.NewRow();
newdr[0] = name[0];
newdr[1] = name[1];
newdr[2] = item.Value;
dt2.Rows.Add(newdr);

参考技术A 不能用linq,新建一个datatable,只能遍历求和拉,往新datatable里面写。。。追问

具体方法呢?

追答

这样肯定可以,写了好一会儿了,参考着写吧,测试通过的。。。
DataTable dtProduct = new DataTable("Product");
dtProduct.Columns.Add("品牌", typeof(String));
dtProduct.Columns.Add("物品", typeof(String));
dtProduct.Columns.Add("数量", typeof(Int32));
DataRow row = dtProduct.NewRow();
row[0] = "联想";
row[1] = "台式机";
row[2] = 1;
dtProduct.Rows.Add(row);
row = dtProduct.NewRow();
row[0] = "联想";
row[1] = "台式机";
row[2] = 2;
dtProduct.Rows.Add(row);
row = dtProduct.NewRow();
row[0] = "联想";
row[1] = "台式机";
row[2] = 3;
dtProduct.Rows.Add(row);
row = dtProduct.NewRow();
row[0] = "惠普";
row[1] = "台式机";
row[2] = 1;
dtProduct.Rows.Add(row);
row = dtProduct.NewRow();
row[0] = "惠普";
row[1] = "台式机";
row[2] = 10;
dtProduct.Rows.Add(row);
DataTable dt= new DataTable("Product2");
dt.Columns.Add("品牌", typeof(String));
dt.Columns.Add("物品", typeof(String));
dt.Columns.Add("数量", typeof(Int32));
foreach (DataRow dr in dtProduct.Rows)

DataRow[] drs = dt.Select("品牌='" + dr["品牌"] + "' and 物品='" + dr["物品"] + "'");
if (drs.Length < 1)

row = dt.NewRow();
row[0] = dr["品牌"]+"";
row[1] = dr["物品"] + "";
row[2] = int.Parse(dr["数量"] + "");
dt.Rows.Add(row);

else

drs[0].BeginEdit();
drs[0]["数量"] = int.Parse(drs[0]["数量"]+"") + int.Parse(dr["数量"]+"");
drs[0].EndEdit();

本回答被提问者采纳
参考技术B 你可以用SQL语句的,
select 品牌,物品,(select count(*) from 你的表 where 品牌='联想' and (物品='台式电脑' or 物品='笔记本电脑'))as 数量 from 你的表,然后再绑定追问

数据不是从数据库中取的,是自己声明的DT,自定义的结构,现在要把数据合并,写到数据库中去

参考技术C 使用Linq2DataSet,group by品牌和物品,然后sum数量即可追问

方案是2.0的,不用LINQ呢?

追答

你可以用linq bridge啊,如果你用vs2008开发一样可以在.net 2.0用linq

参考技术D select 品牌,物品,SUM(数量) as shu from 表group by 品牌,数量追问

数据不是从数据库中取的,是自己声明的DT,自定义的结构,现在要把数据合并,写到数据库中去

以上是关于ASP.NET C# 如何合并DataTable中的重复数据(做数据整合)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET C#中如何在excel中下载gridview,即如何在datatable中使用group by

asp.net c# 如何取出datatable指定行的值

C# ASP.NET怎么手动给GridView赋值,不从数据库中读取?

Asp.net C# 使用Newtonsoft.Json 实现DataTable转Json格式数据

C#写ASP.NET,怎么导出一个DataTable到Excel

c# asp.net GridView中如何删除一条记录后刷新页面