2016-07-27 53 views
0

美好的一天。清除数据表中的重复列单元格值

我看到的最近文章是this post

我有一个具有以下信息的DataTable:

ID COL1 COL2 COL3 
10 ABC  Town Dog 
20 AAA  Town Dog 
30 BBB  Town Cat 
40 CCC  City Cat 
50 DDD  City Pig 

我想清除出列与类似的价值,因此,只有每个遗体的第一个实例。要过滤的列是用户输入,它可以产生:

ID COL1 COL2 COL3    ID COL1 COL2 COL3 
10 ABC  Town Dog    10 ABC  Town Dog 
20 AAA    Dog    20 AAA  Town  
30 BBB    Cat  OR  30 BBB  Town Cat 
40 CCC  City Cat    40 CCC  City  
50 DDD    Pig    50 DDD  City Pig 

到目前为止,我有一个工作的代码,但它执行缓慢。

foreach (string strListVal in lstUniqueString) //contains the unique values 
{ 
     foreach (DataRow drTableTraverse in dt.Rows) //match the string vs. all rows 
     { 
      if (drTableTraverse[strColumnName].ToString() == strListVal && bClearedFirst == false) 
      { 
       bClearedFirst = true; //flag for the first instance 
       continue; //skip the first instance, then clear the remaining 
      } 
      else if (drTableTraverse[strColName].ToString() == strListVal) 
      { 
       drTableTraverse[strColumnName] = ""; 
      } 
    } 
} 

有没有更快的方法来实现相同的结果?没有使用LINQ,如果有的话。

+0

如果重复发生,那么你要设置为空值(空字符串)? –

+0

是的,这是正确的。重复项将为空字符串,并且第一个实例将保留其值 – valmanway

回答

0

这似乎是一个更优化的解决方案

foreach (string strListVal in lstUniqueString) 
{ 
    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     if (dt.Rows[i][strAttribute].ToString().Equals(strListVal) && bClearedFirst == false) 
     { 
      bClearedFirst = true; 
      continue; //should skip first instance 
     } 
     else if (dt.Rows[i][strAttribute].ToString().Equals(strListVal) && bClearedFirst == true) 
     { 
      dt.Rows[i][strAttribute] = DBNull.Value; 
     } 
    } 
    bClearedFirst = false; //reset 
}