C#winform中如何最快得到datatable表中的所有重复行

bangfj 2012-01-11 10:29:01
datatable表是读取的excel文件 我想读取表里面的所有重复行 组合主键为3个字段。我的excel文件有2万条记录。一条一条的比方法太慢。要等上10分钟,用datatable.primarykey方法也慢。请各位大侠指点一个最快的方法。谢谢~~~
...全文
463 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bangfj 2012-01-12
  • 打赏
  • 举报
回复
7#高手 就等你了~~~~
苦苦的潜行者 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bangfj 的回复:]

linq 不大会 能写点代码做参考吗?
[/Quote]

问7楼的Tim吧,他是大神,我这几天也正在学linq,有问题都是问的他.
另外我刚学到分组,你这个问题我还真不会整.
x1937 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 q107770540 的回复:]

参考:
http://blog.csdn.net/q107770540/article/details/5784646

继承自IEqualityComparer
使用linq2datatable来实现distict

你先自己试一下,不行的话晚上我再给你写个DEMO
[/Quote]

学习~~~
bangfj 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiaolinyouni 的回复:]

引用楼主 bangfj 的回复:
datatable表是读取的excel文件 我想读取表里面的所有重复行 组合主键为3个字段。我的excel文件有2万条记录。一条一条的比方法太慢。要等上10分钟,用datatable.primarykey方法也慢。请各位大侠指点一个最快的方法。谢……


datatable吗,用linq最快.可以直接进行筛选
[/Quote]
linq 不大会 能写点代码做参考吗?
苦苦的潜行者 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 bangfj 的回复:]
datatable表是读取的excel文件 我想读取表里面的所有重复行 组合主键为3个字段。我的excel文件有2万条记录。一条一条的比方法太慢。要等上10分钟,用datatable.primarykey方法也慢。请各位大侠指点一个最快的方法。谢……
[/Quote]

datatable吗,用linq最快.可以直接进行筛选
bangfj 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 q107770540 的回复:]

参考:
http://blog.csdn.net/q107770540/article/details/5784646

继承自IEqualityComparer
使用linq2datatable来实现distict

你先自己试一下,不行的话晚上我再给你写个DEMO
[/Quote]
不好意思 linq我刚接触 昨天就看了一下午了 越看越晕。。。。。
wetcom 2012-01-12
  • 打赏
  • 举报
回复
分组查询一下就可以了,可以用Linq查询,也可以SQL
bangfj 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 q107770540 的回复:]

引用 3 楼 bangfj 的回复:
引用 2 楼 tory_yang 的回复:

你读取的时候可以用sql,distinct一下,否则也只好冒泡比对了

我还想得到 重复的行 及其信息

C# code

void Main()
{
DataTable dt=new DataTable();
dt.Columns.Add("id1",typeof(int));
……
[/Quote]
如果说我的主键字段是存放在数据库中的,每个表都有不同的主键。 我从数据库中得到主键字段后,怎么把Field<int>()括号里面的字段名字变成变量?
q107770540 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bangfj 的回复:]
引用 2 楼 tory_yang 的回复:

你读取的时候可以用sql,distinct一下,否则也只好冒泡比对了

我还想得到 重复的行 及其信息
[/Quote]

void Main()
{
DataTable dt=new DataTable();
dt.Columns.Add("id1",typeof(int));
dt.Columns.Add("id2",typeof(int));
dt.Columns.Add("id3",typeof(int));
dt.Columns.Add("name");
dt.Rows.Add(1,1,1,"Tim");
dt.Rows.Add(1,1,1,"Tim1");
dt.Rows.Add(1,1,1,"Tim2");
dt.Rows.Add(1,1,1,"Tim3");
dt.Rows.Add(2,2,2,"Tom");
dt.Rows.Add(2,2,2,"Tom");
dt.Rows.Add(3,1,1,"Tam");
dt.Rows.Add(3,1,1,"Tbm");
dt.Rows.Add(4,1,1,"Tcm");
dt.Rows.Add(5,1,1,"Tdm");
var query=dt.AsEnumerable().GroupBy(t=>new{id1=t.Field<int>("id1"),id2=t.Field<int>("id2"),id3=t.Field<int>("id3")})
.Where(g=>g.Count()>1) //找出重复行
.Select(g=>new{g.Key.id1,g.Key.id2,g.Key.id3,c=g.Count()});

}
bangfj 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gws044010607 的回复:]

装DataTable的时候就开始比对,每新增一条就比对一次。或者可以这样,先不装入DataTable,存入一个HashTable,每新增一条就比对一次,这样更快。
[/Quote]
这种方法也比较慢吧 增加一条遍历一遍 增加一条遍历一遍 2万条 太慢
bangfj 2012-01-11
  • 打赏
  • 举报
回复
难道没有其它的方法了吗????
赤脚的蜈蚣 2012-01-11
  • 打赏
  • 举报
回复
装DataTable的时候就开始比对,每新增一条就比对一次。或者可以这样,先不装入DataTable,存入一个HashTable,每新增一条就比对一次,这样更快。
bangfj 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tory_yang 的回复:]

你读取的时候可以用sql,distinct一下,否则也只好冒泡比对了
[/Quote]
我还想得到 重复的行 及其信息
T3p0 2012-01-11
  • 打赏
  • 举报
回复
你读取的时候可以用sql,distinct一下,否则也只好冒泡比对了
T3p0 2012-01-11
  • 打赏
  • 举报
回复
你读取的时候可以用sql,distinct一下,否则也只好冒泡比对了
DENQH 2012-01-11
  • 打赏
  • 举报
回复
linq  groupby conut(重复的字段)>1
uvvvw 2012-01-11
  • 打赏
  • 举报
回复
linq
q107770540 2012-01-11
  • 打赏
  • 举报
回复
参考:
http://blog.csdn.net/q107770540/article/details/5784646

继承自IEqualityComparer
使用linq2datatable来实现distict

你先自己试一下,不行的话晚上我再给你写个DEMO

111,100

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧