我是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)
。
有关如何解决问题的建议吗?
答案 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