检查重复项并从DataTable中删除行但附加列值

时间:2014-07-03 07:58:23

标签: c# asp.net datatable

有一个棘手的问题。我有一个数千或数行的数据表。它有两列。使用其中一列作为密钥我需要检查重复项。如果有,我将需要将另一列中的值添加到一列中并删除重复的行。我能够找到重复并添加值。但是当我删除一行时,它会影响其余部分,因为索引已被更改。另外,我不确定我是否有效率。请指教。

   Cate_Id      TrxnCount
 ----------       ----------
    ER01              0
    ER02              0
    ER41              0
    ER53              1
    ER53              2
    ER56              0
    ER56              0
    ER56              0
    ER57              8
    ER57              9

移除并添加值

 Cate_Id           TrxnCount
 ----------       ----------
    ER01              0
    ER02              0
    ER41              0
    ER53              3 
    ER56              0
    ER57              17

如何以简单有效的方式实现这一目标。请指教。

这就是我所做的:

  List<DataRow> rowsToDelete = new List<DataRow>();
  int newValue = 0;
  for (int i = 15; i < dt.Rows.Count; i++)
  {
    if (i > 0)
    {
       // Compare with previous row using index
      if (dt.Rows[i]["Cate_Id "].ToString() == dt.Rows[i - 1]["Cate_Id "].ToString())
      {
        newValue = Convert.ToInt32(dt.Rows[i]["TrxnCount"].ToString()) + Convert.ToInt32(dt.Rows[i - 1]["TrxnCount"].ToString());
        dt.Rows[i]["TrxnCount"] = newValue;
        rowsToDelete.Add(dt.Rows[i - 1]);
         newValue = 0;
      }
    }
      if (i < dt.Rows.Count - 1)
      {
        if (dt.Rows[i]["Cate_Id"].ToString() == dt.Rows[i + 1]["Cate_Id"].ToString())
        {
         newValue = Convert.ToInt32(dt.Rows[i]["TrxnCount"].ToString()) + Convert.ToInt32(dt.Rows[i - 1]["TrxnCount"].ToString());
         dt.Rows[i]["TrxnCount"] = newValue;
         rowsToDelete.Add(dt.Rows[i - 1]);
         newValue = 0;
         }
       }     
   }


  foreach(var r inrowsToDelete )
  dt.Rows.Remove(r);

1 个答案:

答案 0 :(得分:0)

要以更有效的方式在数据库方面执行此操作。

您可以编写执行此操作的存储过程:

  • 选择由Cate_Id分组的TrxnCount的总和和计数,具有&gt; 1
  • 将结果存储在重复的临时表中
  • 从原始表中删除Cate_Id存在于重复临时表中的所有记录
  • 将临时表中的所有值都插入到原始表中

在客户端这样做效率要高得多。

顺便说一句,这有一个可怕的设计缺陷:表没有PK,这是非常糟糕的主意。

tyhe存储过程的代码(我假设原始表名是T

BEGIN TRAN

SELECT Cate_Id, SUM(T.TrxnCount) AS TrxnCount 
INTO #dups
FROM T GROUP BY T.Cate_Id HAVING COUNT(*) > 1

DELETE FROM T WHERE Cate_Id IN (SELECT Cate_Id FROM #dups)
INSERT INTO T SELECT * FROM #Dups

COMMIT TRAN