GroupBy使用已知类作为分组键

Sha*_*tin 4 c# linq grouping

我们希望将GroupBy已知类作为分组键.它似乎不起作用 - LINQ似乎需要与匿名类组合.

  • 是否可以使用GroupBy已知类作为分组键?
  • 如果没有,为什么不呢?
  • 如果是这样,怎么样?

这个问题与为什么使用匿名类型工作和使用不在GroupBy中的显式类型不同?因为它询问如何使用GroupBy已知的类.

这是一个小提琴,显示哪些有效,哪些无效.失败的那个不会创建一个组.

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()
        });
}
Run Code Online (Sandbox Code Playgroud)

BJ *_*ers 7

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

根据GroupBy文档:

默认的相等比较器Default用于比较键.

对于匿名类型,默认的相等比较器使用逐个属性的比较,因此具有相同成员和值的任何两个匿名类型将被视为等效.

对于具体类型,默认的相等比较器使用引用比较,因此对象的任何两个实例始终被视为不等价,而不管它们的值如何.

为了使GroupBy你的工作GroupingKey类,你可以使用重载接受一个IEqualityComparer<T>定义的比较,或者覆盖Object.EqualsGroupingKey执行所需要的比较.