GroupBy使用已知类作为分组键

时间:2015-05-04 21:57:30

标签: c# linq grouping

我们希望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()
        });
}

1 个答案:

答案 0 :(得分:6)

区别在于对匿名类型与具体类型进行比较的方式。

根据GroupBy documentation

  

默认的相等比较器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)); 执行所需的比较。