C# 处理DataTable 重复数据

Posted

tags:

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

一个 datatable 里面 假如有A B C D 4列 10W行数据 要求 C列所有行相同的数据只保留一行,其他的删除掉,给出一个算法10秒内处理完成

你可以用HashSet<T>来存储已存在的行 检索速度会快很多 代码如下 不知道你的机子什么配置 我的机子Debug模式100000行数据 用了232毫秒using System;
using System.Data;
using System.Collections.Generic;
using System.Diagnostics;

namespace ConsoleApplication1

class Program

static void Main(string[] args)

DataTable dataTable = new DataTable();
dataTable.Columns.AddRange(new DataColumn[]
new DataColumn("A"),
new DataColumn("B"),
new DataColumn("C"),
new DataColumn("D")
);
for (int i = 0; i < 50000; i++)

dataTable.Rows.Add(new object[] 0, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + i.ToString(), 0 );
dataTable.Rows.Add(new object[] 0, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + (50000 - i).ToString(), 0 );

Stopwatch stopwatch = new Stopwatch();
stopwatch.Reset();
stopwatch.Start();
Console.WriteLine("DataTable行数:0", dataTable.Rows.Count);
HashSet<string> hash = new HashSet<string>();//.NET 3.0以上使用
//Dictionary<string, int> dic = new Dictionary<string, int>();//.NET 2.0可以用这个
for (int i = 0; i < dataTable.Rows.Count; i++)

//if (dic.ContainsKey(dataTable.Rows[i][2] as string))//.NET 2.0
//
// dic.Add(dataTable.Rows[i][2] as string, 0);
//
if (!hash.Contains(dataTable.Rows[i][2] as string))

hash.Add(dataTable.Rows[i][2] as string);

else

dataTable.Rows.RemoveAt(i);
i--;


stopwatch.Stop();
Console.WriteLine("用时:0毫秒", stopwatch.ElapsedMilliseconds);
Console.WriteLine("DataTable行数:0", dataTable.Rows.Count);
Console.ReadKey();


参考技术A 如果有id列是标识列:DELETE FROM table1 t1
WHERE t1.id> (SELECT min(t2.id) FROM table t2 WHERE t1.C=t2.C);因为最小的就一条记录,把比最小的都删除掉,结果就只剩一条记录了。

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,自定义的结构,现在要把数据合并,写到数据库中去

以上是关于C# 处理DataTable 重复数据的主要内容,如果未能解决你的问题,请参考以下文章

c#中datatable绑定comboBox显示数据有重复怎么处理?取值时未用SQL语句。

C# Winform DataTable 怎么过滤两列不重复

c#中datatable如何去除重复数据

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

C# DataTable行转列并合并重复列。

c#中同一个Datatable中的如何把重复的记录合并起来,