2017-10-10 3 views
-5

私は次のようなデータテーブルを持っています。C#のデータテーブルの列の値に影響する

Name Val ID 
-------------- 
Raja 0 101 
--------------- 
Ram  0 102 
--------------- 
Ray  0 103 
--------------- 
Raja 0 104 
--------------- 

私は私のDataTableのラジャ名はので、私はラジャ(2)に名前を変更したい第二の時間を繰り返しagain.In同じ名前が繰り返された場合、私のデータテーブルの列に影響を与えるようにしたいです。

O/P:

Name Val ID 
    -------------- 
    Raja 0 101 
    --------------- 
    Ram  0 102 
    --------------- 
    Ray  0 103 
    --------------- 
    Raja(2) 0 104 
    --------------- 

これを取得するために私を導いてください。

ここ
DataTable table = new DataTable(); 
      table.Columns.Add("Name", typeof(string)); 
      table.Columns.Add("Item", typeof(string)); 
      table.Columns.Add("Qty", typeof(string)); 

      table.Rows.Add("AAA", "Indocin", "David"); 
      table.Rows.Add("XXX", "Enebrel", "Sam"); 
      table.Rows.Add("AAA", "Hydralazine", "Christoff"); 
      table.Rows.Add("CCC", "Combivent", "Janet"); 
      table.Rows.Add("AAA", "Dilantin", "Melanie"); 
      // Query with Linq 
      var newNames = table.AsEnumerable() 
           .Select((row, rowIndex) => new { rowIndex, index }) // storing row and index of it in anonymous type 
           .GroupBy(x => x.row.Field<string>("Name"))   // group by Name 
           .Where(g => g.Count() > 1)       // take only duplicates 
           .SelectMany(g => g         // select all rows but first of duplicates 
            .Where(x => x.rowIndex > 0) 
        /*Error*/    .Select((x, dupIndex) => new { x.rowIndex, newName = $"{g.Key}({dupIndex + 1})" }));  

      foreach(var x in newNames) 
       table.Rows[x.index].SetField("Name", x.newName); 
      /***********/ 

私のコード..

+1

[so]は無料コード作成サービスではありません。 **あなた自身でコードを書くことを試みることが期待されます**。 [もっと研究をして](http://meta.stackoverflow.com/questions/261592)問題がある場合は**あなたが試したことを投稿することができます** **動作していないことの明確な説明**を提供し、** [mcve] **を提供します。私は良い質問と[完璧な質問]を読むことをお勧めします(http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)。また、[ツアー]も必ず行ってください。 – Igor

答えて

1

あなたは、特にLinq-To-DataTableGroupByを使用することができます。

var newNames = table.AsEnumerable() 
    .Select((row, rowIndex) => new { row, rowIndex }) // storing row and index of it in anonymous type 
    .GroupBy(x => x.row.Field<string>("Name"))   // group by Name 
    .Where(g => g.Count() > 1)       // take only duplicates 
    .SelectMany(g => g         // select all rows but first of duplicates 
     .Where(x => x.rowIndex > 0) 
     .Select((x, dupIndex) => new { x.rowIndex, newName = $"{g.Key}({dupIndex + 2})" }));  

foreach(var x in newNames) 
    table.Rows[x.rowIndex].SetField("Name", x.newName); 

私は重複している行のみ(+そのインデックスを)取って、その後、名前でグループ化しています。それらの重複グループから私は最初のものを取る(その名前が残っているので)。

+0

コードは次の行に入力されます。.Select(x => new {x.index、newName = $ "{g.Key}({x.index + 2})")); – Moni

+0

@モニ:私は自分の答えを編集して、少し説明を加えました。さらに質問があるかどうか質問してください。テスト済みです。 –

+0

@ Tim .Select((x、dupIndex)=> new {x.index、D = $ "{g.Key}({dupIndex + 1})}));この行は、私がこれを使用することができないエラーを示しています。修理を手伝ってください。 – Moni

関連する問題