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
classEquals
以及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())代码>