Joh*_*tos 3 c# linq vb.net datatable
我有以下数据 - 让我们说MyTable:
Col1: Col2: Col3: Col4:
1 abc def <null>
2 abc def ghi
1 abc def <null>
3 abc def <null>
1 abc def <null>
Run Code Online (Sandbox Code Playgroud)
而我正试图获得不同的行:
Col1: Col2: Col3: Col4:
1 abc def <null>
2 abc def ghi
3 abc def <null>
Run Code Online (Sandbox Code Playgroud)
我尝试了以下LINQ语句:
MyTable = (From dr As DataRow In MyTable Select dr).Distinct.CopyToDataTable
Run Code Online (Sandbox Code Playgroud)
但它将原始数据表返回给我重复的行.
我做错了什么以及如何获得我想要的输出?
Distinct依赖于所有执行的对象IEquatable和/或具有的显实现GetHashCode和Equals.该DataRow班......没有.它不检查Equals方法中每列的值是否相等,它只是使用默认实现,也就是说它检查引用是否相等,而这不是你想要的.
您可以提供自己的IEqualityComparer,因为您无法更改方法DataRow.
如果您提供以下内容的实例,则以下内容应该有效Distinct:
public class DataRowComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
for (int i = 0; i < x.Table.Columns.Count; i++)
{
if (!object.Equals(x[i], y[i]))
return false;
}
return true;
}
public int GetHashCode(DataRow obj)
{
unchecked
{
int output = 23;
for (int i = 0; i < obj.Table.Columns.Count; i++)
{
output += 19 * obj[i].GetHashCode();
}
return output;
}
}
}
Run Code Online (Sandbox Code Playgroud)