我们希望GroupBy
使用已知类作为分组键。它似乎不起作用 - LINQ似乎需要与匿名类组合。
GroupBy
与已知类一起用作分组键? 此问题与Why does using anonymous type work and using an explicit type not in a GroupBy?不同,因为它要求如何将GroupBy
与已知类一起使用。
这是a fiddle that shows what works and what fails。失败的那个不会创建一个组。
public static void Works(EnumerableRowCollection<DataRow> dataRows)
{
var grouped = dataRows.GroupBy(
row => new {
Name = row["Name"]
},
(k, g) => new {
Key = k,
Group = g.CopyToDataTable()
});
}
public static void Fails(EnumerableRowCollection<DataRow> dataRows)
{
var grouped = dataRows.GroupBy(
row => new GroupingKey {
Name = row["Name"]
},
(k, g) => new {
Key = k,
Group = g.CopyToDataTable()
});
}
答案 0 :(得分:6)
区别在于对匿名类型与具体类型进行比较的方式。
默认的相等比较器Default用于比较键。
对于匿名类型,默认的相等比较器使用逐个属性的比较,因此具有相同成员和值的任何两个匿名类型都将被视为等效。
对于具体类型,默认的相等比较器使用引用比较,因此对象的任何两个实例都始终被认为是不等价的,无论它们的值如何。
要让GroupBy
使用GroupingKey
课程,您可以使用IEqualityComparer<T>
Object.Equals
来定义比较,也可以覆盖GroupingKey
// if you know the name of the cluster
db.existsCluster("V");
// if you only know the id of the cluster
db.existsCluster(db.getClusterNameById(9));
执行所需的比较。