2 fantasy19911002 fantasy19911002 于 2016.02.03 16:34 提问

C#中Datatable删除行的一个不解之处

C#把Datatable中重复的行删除后绑定DataGridView,发现没变,不清楚是什么情况,各位帮忙看看。代码如下:
for(int i=0;i<dt.rows.count;i++)
{
for(int j=0;j<dt.rows.count;j++)
{
if(dt.rows[j][2].tostring()==dt.rows[i][2].tostring())
{
dt.rows[j].delete();
dt.AccpetChanges();
}
}
}

datagridview1.datasource=dt;

5个回答

caozhy
caozhy   Ds   Rxr 2016.02.03 18:01
 DataRow[] todel = dt.Rows.OfType<DataRow>.GroupBy(x => x[2].ToString()).SelectMany(x => x.Skip(1)).ToArray();
foreach (var item in todel)
    item.Delete();
dt.AcceptChanges();
u014370904
u014370904   2016.02.03 16:57

if(dt.rows[j][2].text.tostring()==dt.rows[i][2].text.tostring())

sipoli1984
sipoli1984   2016.02.03 17:25

用rows.remove()啊。

qinghe1987
qinghe1987   2016.02.03 16:54

你这是在干嘛?删除表?

91program
91program   Ds   Rxr 2016.02.03 17:01

首先,这个循环体写的就有问题,个人觉得至少应该修改为如下的。
另外,检测一下 delete 和 AcceptChanges 函数的返回,看看执行是否成功。
最后,是大的逻辑问题:如果 j 被删除, count 会变化(减一),这样做循环是否有访问越界的可能性!

for(int i=0;i<dt.rows.count;i++)
{
for(int j=i + 1;j<dt.rows.count;j++)    /// 修改处
{
if(dt.rows[j][2].tostring()==dt.rows[i][2].tostring())
{
dt.rows[j].delete();
dt.AccpetChanges();
}
}
}
datagridview1.datasource=dt; 
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!