C# (Fluent)按强类型划分的linq组

C# (Fluent)按强类型划分的linq组,c#,linq,C#,Linq,我不明白,也许有人会点燃我。 这项工作: var grouped = getRuntimeParams(sheet, pcode) .GroupBy(x => new { dbTable = x.dbTable, dbIndexField = x.dbIndexField, dbIndex = x.dbIndex }); 这意味着我将按其应有的方式对行进行分组。 这并不意味着结果是逐行“分组”的: var grouped = getRuntimeP

我不明白,也许有人会点燃我。 这项工作:

var grouped = getRuntimeParams(sheet, pcode)
  .GroupBy(x => new { 
     dbTable = x.dbTable, 
     dbIndexField = x.dbIndexField, 
     dbIndex = x.dbIndex });
这意味着我将按其应有的方式对行进行分组。 这并不意味着结果是逐行“分组”的:

var grouped = getRuntimeParams(sheet, pcode)
  .GroupBy(x => new ParamGroup { 
     dbTable = x.dbTable, 
     dbIndexField = x.dbIndexField, 
     dbIndex = x.dbIndex });
但是我需要将结果组传递给一个方法,因此我需要它是强类型的。当然,ParamGroup类是公共的,具有公共属性,如图所示。 我做错了什么?
谢谢。

第一个查询有效,第二个查询将每一行单独放入一个组,这一事实只表明一件事:
ParamGroup
没有正确实现
Equals
HashCode


如果这是您的类,那么实现这些方法将解决问题。否则,您需要使用一个重载。第一个查询有效,第二个查询将每一行单独放入一个组,这一事实只指向一件事:
ParamGroup
没有正确实现
Equals
HashCode

如果这是您的类,那么实现这些方法将解决问题。否则,您需要使用一个重载,该重载需要一个。

您必须重写
ParamGroup
Equals
以及
GetHashCode
方法,如下所示:

public class ParamGroup {

  ... 

  public override bool Equals(Object o) {
    ParamGroup other = o as ParamGroup;

    if (null == other)
      return false;

    return dbTable == other.dbTable &&
           dbIndexField == other.dbIndexField &&
           dbIndex == other.dbIndex;
  }

  public override int GetHashCode() {
    return (dbIndexField == null ? 0 : dbIndexField.GetHashCode()) ^
            dbIndex ^
           (dbTable == null ? 0 : dbTable.GetHashCode());
  }
}
错误行为的原因是,当未被覆盖时,
ParamGroup
使用默认的
Equals
实现(来自
Object
),它比较引用,而不是实例的字段/属性,因此所有实例都不同(不相等)

匿名类型(在第一个示例中)覆盖以下方法:

您必须重写
ParamGroup
class
Equals
以及
GetHashCode
方法,如下所示:

public class ParamGroup {

  ... 

  public override bool Equals(Object o) {
    ParamGroup other = o as ParamGroup;

    if (null == other)
      return false;

    return dbTable == other.dbTable &&
           dbIndexField == other.dbIndexField &&
           dbIndex == other.dbIndex;
  }

  public override int GetHashCode() {
    return (dbIndexField == null ? 0 : dbIndexField.GetHashCode()) ^
            dbIndex ^
           (dbTable == null ? 0 : dbTable.GetHashCode());
  }
}
错误行为的原因是,当未被覆盖时,
ParamGroup
使用默认的
Equals
实现(来自
Object
),它比较引用,而不是实例的字段/属性,因此所有实例都不同(不相等)

匿名类型(在第一个示例中)覆盖以下方法:


class是否覆盖了
ParamGroup
Equals以及
GetHashCode
方法?什么意思是您的结果没有按行分组?这意味着每个组中只有一行。@DmitryBychenko可能就是这样!顺便说一句,如果这3个属性应该用作组键,那么所有
ParamGroup
实例都将具有相同的属性。
getRuntimeParams
是否返回多个
ParamGroup
s?是否要覆盖原始实例?
ParamGroup
类是否覆盖了
Equals
以及
GetHashCode
方法?什么意思是结果没有逐行分组?这意味着每个组中只有一行。@DmitryBychenko可能就是这样!顺便说一句,如果这3个属性应该用作组键,那么所有
ParamGroup
实例都将具有相同的属性。
getRuntimeParams
是否返回多个
ParamGroup
s?您想要原始实例吗?如果
getRuntimeParams
返回它们,他还可以在匿名类型的
GroupBy
之后选择原始
ParamGroup
实例:
var group=getRuntimeParams(sheet,pcode)。GroupBy(x=>new{x.dbTable,x.dbIndexField,x.dbIndex})。选择(g=>g.ToList())
如果
getRuntimeParams
返回了匿名类型的
GroupBy
之后的原始
ParamGroup
实例:
var grouped=getRuntimeParams(sheet,pcode).GroupBy(x=>new{x.dbTable,x.dbIndexField,x.dbIndex}).select(g=>g.ToList())