关于dataset中的重复行

norikosaika0001 2009-01-04 01:54:07
ds1.table[0]:
item1 item2 item3
a 1 1
b 2 2
c 3 3
a 1 1
ds1.table[1]:
item1 item2 item3
p 1 1
q 2 2
r 3 3
a 1 1
1、想要查找并删除table[0]中的重复行
2、想要查找table[0]和table[1]的重复行
谢谢!
...全文
384 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
谢谢!
sprc_lcl 2009-01-04
  • 打赏
  • 举报
回复
dv.ToTable();
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
那如何把排序过的dataview更新到datatable呢?
sprc_lcl 2009-01-04
  • 打赏
  • 举报
回复
ds1.Tables["a"].Rows.Add(dr)
不能用Add来加已存在的dr,会报dr已被其它表应用的错
sprc_lcl 2009-01-04
  • 打赏
  • 举报
回复
你那里面有"a"表吗?有的话你加上去就是了
dt3 = ds.Tables["a"];

排序要用到DataView
dv = ds.Tables["a"].DefaultView;
dv.Sort="item1 desc";//降序
dv.Sort="item1 asc";//升

取的时候要取DataView,DataTable的是没变的
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
dataset的表“a”如何根据字段“item1”排序呢?
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
楼上的谢谢,那为什么不能这样把重复的行添加到“a”表呢:ds1.Tables["a"].Rows.Add(dr)
sprc_lcl 2009-01-04
  • 打赏
  • 举报
回复
DataSet ds;
DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];
DataTable dt3 = dt1.Clone();
dt3.Clear();
ds.Tables.Add(dt3,"dt3");

//重复行
for (int i = 0; i < dt1.Rows.Count; i++)
{
DataRow dr = dt1.Rows[i];
for (int j = 0; j < dt2.Rows.Count; j++)
{
DataRow dr2 = dt2.Rows[j];
for (int k = 0; k < dt1.Columns.Count; k++)
{
if (dr[k] != dr2[k])
{
break;
}
if (k == dt1.Columns.Count - 1)
{
dt3.ImportRow(dr);//存入新表
}
}
}
}

//删除表
ds.Tables.Remove(ds.Tables["b"]);
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
哦对了,还有,如何删除dataset里的表“b”呢?
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
抱歉,是我的字段里有空格,用trim解决了。
那么,如何把重复的dr添加到同一ds的table里呢?
Fibona 2009-01-04
  • 打赏
  • 举报
回复
void TestDataSetDup()
{

DataSet ds = new DataSet();
//ds.Tables.Add(

DataTable dt1 = new DataTable();
dt1.Columns.Add("item1");
dt1.Columns.Add("item2");
dt1.Columns.Add("item3");
dt1.Rows.Add("a", "1", "1");
dt1.Rows.Add("b", "2", "2");
dt1.Rows.Add("c", "3", "3");
dt1.Rows.Add("a", "1", "1");

dt1.AcceptChanges();

DataTable dt2 = new DataTable();
dt2.Columns.Add("item1");
dt2.Columns.Add("item2");
dt2.Columns.Add("item3");
dt2.Rows.Add("p", "1", "1");
dt2.Rows.Add("q", "2", "2");
dt2.Rows.Add("r", "3", "3");
dt2.Rows.Add("a", "1", "1");

dt2.AcceptChanges();
ds.Tables.Add(dt1);
ds.Tables.Add(dt2);

ds.AcceptChanges();


for (int i=0;i<ds.Tables[0].Rows.Count;i++)
{
DataRow row = ds.Tables[0].Rows[i];
for (int j = i + 1; j < ds.Tables[0].Rows.Count; j++)
{
DataRow row2 = ds.Tables[0].Rows[j];
bool flag=false;
for (int m = 0; m < ds.Tables[0].Columns.Count; m++)
{
if (row[m].ToString() != row2[m].ToString())
{
flag=true;
break;
}
}
if (!flag)
{
ds.Tables[0].Rows.Remove(row2);
}
}
}
ds.Tables[0].AcceptChanges();
//查找table[0]与table[1]中的重复行

List<int> dupList = new List<int>();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow row = ds.Tables[0].Rows[i];
for (int j = i; j < ds.Tables[1].Rows.Count; j++)
{
DataRow row2 = ds.Tables[1].Rows[j];
bool flag = false;
for (int m = 0; m < ds.Tables[0].Columns.Count; m++)
{
if (row[m].ToString() != row2[m].ToString())
{
flag = true;
break;
}
}
if (!flag)
{
//ds.Tables[0].Rows.Remove(row2);
dupList.Add(j+1);
}
}
}

string dupRowStr = "";
for (int i = 0; i < dupList.Count; i++)
{
if (i == 0)
dupRowStr = "表2中重复行为第:" +dupList[i];
else
dupRowStr += "," +dupList[i];
}

MessageBox.Show(dupRowStr);
}
Fibona 2009-01-04
  • 打赏
  • 举报
回复
 void TestDataSetDup()
{

DataSet ds = new DataSet();
//ds.Tables.Add(

DataTable dt1 = new DataTable();
dt1.Columns.Add("item1");
dt1.Columns.Add("item2");
dt1.Columns.Add("item3");
dt1.Rows.Add("a", "1", "1");
dt1.Rows.Add("b", "2", "2");
dt1.Rows.Add("c", "3", "3");
dt1.Rows.Add("a", "1", "1");

dt1.AcceptChanges();

DataTable dt2 = new DataTable();
dt2.Columns.Add("item1");
dt2.Columns.Add("item2");
dt2.Columns.Add("item3");
dt2.Rows.Add("p", "1", "1");
dt2.Rows.Add("q", "2", "2");
dt2.Rows.Add("r", "3", "3");
dt2.Rows.Add("a", "1", "1");

dt2.AcceptChanges();
ds.Tables.Add(dt1);
ds.Tables.Add(dt2);

ds.AcceptChanges();


for (int i=0;i<ds.Tables[0].Rows.Count;i++)
{
DataRow row = ds.Tables[0].Rows[i];
for (int j = i + 1; j < ds.Tables[0].Rows.Count; j++)
{
DataRow row2 = ds.Tables[0].Rows[j];
bool flag=false;
for (int m = 0; m < ds.Tables[0].Columns.Count; m++)
{
if (row[m].ToString() != row2[m].ToString())
{
flag=true;
break;
}
}
if (!flag)
{
ds.Tables[0].Rows.Remove(row2);
}
}
}
ds.Tables[0].AcceptChanges();
//查找table[0]与table[1]中的重复行

List<int> dupList = new List<int>();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow row = ds.Tables[0].Rows[i];
for (int j = i; j < ds.Tables[1].Rows.Count; j++)
{
DataRow row2 = ds.Tables[1].Rows[j];
bool flag = false;
for (int m = 0; m < ds.Tables[0].Columns.Count; m++)
{
if (row[m].ToString() != row2[m].ToString())
{
flag = true;
break;
}
}
if (!flag)
{
//ds.Tables[0].Rows.Remove(row2);
dupList.Add(j);
}
}
}

string dupRowStr = "";
for (int i = 0; i < dupList.Count; i++)
{
if (i == 0)
dupRowStr = "表2中重复行为:" +dupList[i];
else
dupRowStr += "," +dupList[i];
}

MessageBox.Show(dupRowStr);
}
sprc_lcl 2009-01-04
  • 打赏
  • 举报
回复
修正不来,经测试没问题啊
simonezhlx 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 norikosaika0001 的帖子:]
ds1.table[0]:
item1 item2 item3
a 1 1
b 2 2
c 3 3
a 1 1
ds1.table[1]:
item1 item2 item3
p 1 1
q 2 2
r 3 3
a 1 1
1、想要查找并删除table[0]中的重复行
2、想要查…
[/Quote]
数据从何而来?如果是从数据库来的,起用约束可以避免问题出现,DATASET中也可以应用约束,避免重复项.
如果是自己创建的数据,那主键呢?什么样的数据叫做重复数据呢?
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sprc_lcl 的回复:]
C# codeDataSet ds;
DataTable dt1 = ds.Tables[0];

//删除重复行
for (int i = 0; i < dt1.Rows.Count; i++)
{
DataRow dr = dt1.Rows[i];
for (int j = i + 1; j < dt1.Rows.Count; j++)
{
DataRow dr2 = dt1.Rows[j];
for (int k = 0; k < dt1.Columns.Count; k++)
{

[/Quote]

这个没有用诶。。。
能不能修正下?
norikosaika0001 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sprc_lcl 的回复:]
C# codeDataSet ds;
DataTable dt1 = ds.Tables[0];

//删除重复行
for (int i = 0; i < dt1.Rows.Count; i++)
{
DataRow dr = dt1.Rows[i];
for (int j = i + 1; j < dt1.Rows.Count; j++)
{
DataRow dr2 = dt1.Rows[j];
for (int k = 0; k < dt1.Columns.Count; k++)
{

[/Quote]

大哥,这个没用诶,还是有重复。。。
sunchaohuang 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sprc_lcl 的回复:]
C# code DataSet ds;
DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];

//重复行
for (int i = 0; i < dt1.Rows.Count; i++)
{
DataRow dr = dt1.Rows[i];
for (int j = 0; j < dt2.Rows.Count; j++)
{
DataRow dr2 = dt2.Rows[j];
for (int k = 0; k < dt1.Columns.Count; k++)

[/Quote]


...............
sprc_lcl 2009-01-04
  • 打赏
  • 举报
回复
 DataSet ds;
DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];

//重复行
for (int i = 0; i < dt1.Rows.Count; i++)
{
DataRow dr = dt1.Rows[i];
for (int j = 0; j < dt2.Rows.Count; j++)
{
DataRow dr2 = dt2.Rows[j];
for (int k = 0; k < dt1.Columns.Count; k++)
{
if (dr[k] != dr2[k])
{
break;
}
if (k == dt1.Columns.Count - 1)
{
//dt1 i位置 dt2 j位置 重复行
}
}
}
}
sprc_lcl 2009-01-04
  • 打赏
  • 举报
回复
DataSet ds;
DataTable dt1 = ds.Tables[0];

//删除重复行
for (int i = 0; i < dt1.Rows.Count; i++)
{
DataRow dr = dt1.Rows[i];
for (int j = i + 1; j < dt1.Rows.Count; j++)
{
DataRow dr2 = dt1.Rows[j];
for (int k = 0; k < dt1.Columns.Count; k++)
{
if (dr[k] != dr2[k])
{
break;
}
if (k == dt1.Columns.Count - 1)
{
dt1.Rows.Remove(dr2);
i--;
j--;
}
}
}
}

110,586

社区成员

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

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

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