返回表中的重复数据行

时间:2013-09-16 22:39:34

标签: c# datatable

我是C#的新手(昨天学会了),我遇到以下代码的问题。

我有一个数据表,想要打印重复的行,如果有的话。这是我的代码:

DataTable myTable = myDataSet.Tables[0];

int row_count = myTable.Rows.Count;
bool duplicate_exist = false;
string message = "";

for (int i = 0; i < row_count; i++)
{
    for (int j = i + 1; j < row_count; j++)
    {
        var array1 = fills.Rows[i].ItemArray;
        var array2 = fills.Rows[j].ItemArray;

        if (array1.SequenceEqual(array2))
        {
            duplicate_exist = true;
            message += myTable.Rows[i].ItemArray.Cast<string>().ToArray();
            message += "\n";
         }
     }

 }

异常发生在array1.SequenceEqual(array2)

有关如何解决问题的建议吗?

1 个答案:

答案 0 :(得分:2)

我认为异常是在message += myTable.Rows[i].ItemArray.Cast<string>().ToArray();

但是,您应该使用LINQ来解决问题:

//this comparer is used to compare 2 object[]
public class ArrayComparer : IEqualityComparer<object[]> {
   public bool Equals(object[] x, object[] y) {
     return x.SequenceEqual(y);
   }
   public int GetHashCode(object[] obj){
     return GetHashCode();
   }
}
var dup = myTable.AsEnumerable().GroupBy(x => x.ItemArray, new ArrayComparer())
                                .Where(g=>g.Skip(1).Any())
                                .Select(g => g.First());
foreach(var d in dup){
  message += string.Join(", ", d.ItemArray.Cast<string>()) + "\n";
}
//E.g
//Input
1,2,3
2,3,4
3,4,5
1,2,3
2,3,4
//Output
1,2,3
2,3,4

如果要打印所有重复的行,只需修改一下这样的查询:

var dup = myTable.AsEnumerable().GroupBy(x => x.ItemArray, new ArrayComparer())
                                .Where(g=>g.Skip(1).Any())
                                .SelectMany(g=>g);
//Output
1,2,3
1,2,3
2,3,4
2,3,4