列名称将在此列表中
列出lstPrimary; - 它将具有列名
我将在DataTable上使用GroupBy clasue,使用列表中的列" lstPrimary"
由于
答案 0 :(得分:0)
只是执行GroupBy,因为数据行是对象的类型,所以不会按照您的预期进行分组。相反,您需要实现IEqualityComparer并将其传递给GroupBy。
此代码应作为参考,因为您可能会想要进行一些更改或了解这些限制。对于我没有针对Byte []类型的数据列测试它,我只测试了int,string,DateTime,decimal,我猜它会失败,除非Byte []是相同的数组。如果您需要,那么您将需要更改IEqualityComparer,我建议您查看MS如何为DataRowComparer http://referencesource.microsoft.com/#System.Data.DataSetExtensions/System/Data/DataRowComparer.cs
您希望改变的第二件事是哈希码代码。这只是一个简单的哈希码检查,只检查数组长度是否相同。如果您想要更好的东西,可以查看https://stackoverflow.com/a/3404820/1798889
public class DataRowValueComparer : IEqualityComparer<object[]>
{
public bool Equals(object[] x, object[] y)
{
// didn't test but this probably doesn't work if one of the datacolumns is a Byte[]
return x.SequenceEqual(y);
}
public int GetHashCode(object[] obj)
{
// You will want better hashcode
// can look at https://stackoverflow.com/a/3404820/1798889 for more info
return obj.Length.GetHashCode();
}
}
现在我们可以调用GroupBy并使用它来比较每个数据行值
// group by passing in the IEqualityComparer
var grouped = dt.AsEnumerable().GroupBy(dr => lstPrimary.Select(col => dr[col]).ToArray(), new DataRowValueComparer());
密钥将是一个对象[]