2016-07-27 2 views
0

おはよう。DataTableからの重複列セル値のクリア

私が見た最も近い投稿はthis postでした。

私は、以下の情報を持つデータテーブルがあります。私は、各遺跡の最初のインスタンスのみように、同様の値を持つ列をクリアしたい

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 
} 
関連する問題