2013-11-09 28 views
0

我有以下的DataTable查找重复的行 - 如concatented字符串添加重复的列值,新的一列,然后删除dulplicate列

RequestId userID ProductCode ProductValue 
1   "10004" 70   85.50   
2   "10004" 67   944.00 
3   "10333" 30   97.00 
4   "23344" 70   89.00 

我想实现如下 - 将ProductCodeProductValue连接成一个逗号分隔的字符串到一个新的列中,并且任何重复的行将被添加到这个逗号分隔的字符串中。然后删除重复的行(为了通过请求ID)

RequestId userID ProductCode ProductValue NewColumn 
1   "10004" 70   85.50  "70,85.50,67,944.00" 
3   "10333" 30   97.00  "30,97.00" 
4   "23344" 70   89.00  "70,89.00" 

这是可能使用LINQ - 否则我就通过该表必须循环和查询领域,因为我去?

回答

4
var newTable = oldTable.Clone(); 
newTable.Columns.Add("NewColumn"); 
newTable = oldTable.AsEnumerable() 
        .GroupBy(row => row.Field<string>("userID")) 
        .Select(g => { 
         var newRow = newTable.NewRow(); 
         var firstRow = g.First(); 
         for(int i = 0; i < 4; i++) newRow[i] = firstRow[i]; 
         newRow["NewColumn"] = string.Join(", ", 
              g.Select(row=>row.Field<string>("ProductCode") 
                + ", " + row.Field<decimal>("ProductValue"))); 
         return newRow; 
        }).CopyToDataTable(); 

注:我想产品代码为字符串,并围绕userIdNewColumn值的双引号不是实际价值的一部分。

+0

非常感谢您的答复。只是一个问题。会保证返回的重复行将成为系列中的第一行。如果旧表是由requestId命令的,即。有返回的请求标识1的行吗? – Paul

+0

@Paul'RequestId'应该先排序,在你的例子中,我可以看到它已经被排序,如果你的输入数据可以混洗,你只需要'GroupBy'前面的'OrderBy'。 –

+0

太棒了! - 再次感谢您的帮助 – Paul

相关问题