这是我的疑问:
rows.GroupBy(row => new TaxGroupObject
{
EnvelopeID = row.Field<int>("EnvelopeID"),
PolicyNumber = row.Field<string>("PolicyNumber"),
TZ = row.Field<string>("TZ")
})
.Select(row =>
{
int i;
if (row.Key.EnvelopeID == 5713 && row.Key.PolicyNumber == "50002617" && row.Key.TZ == "50002617")
i=1+1;
var newRow = structure.NewRow();
newRow["PolicyNumber"]=row.Key.PolicyNumber;
newRow["TZ"]=row.Key.TZ;
newRow["CreditPremiaTaxParagraph45"] = row.Sum(x => decimal.Parse(x["CreditPremiaTaxParagraph45"].ToString()));
newRow["WorklossTax"] = row.Sum(x => decimal.Parse(x["WorklossTax"].ToString()));
newRow["MiscTax"] = row.Sum(x => decimal.Parse(x["MiscTax"].ToString()));
newRow["EnvelopeID"] = row.Key.EnvelopeID;
return newRow;
}
);
internal class TaxGroupObject
{
public long? EnvelopeID{ get; set; }
public string PolicyNumber { get; set; }
public string TZ { get; set; }
}
我在“i = 1 + 1”的行上设置断点,在if条件下将我用于该组的所有键与一些硬编码值进行比较。该断点被击中两次,尽管该组假设将所有行与相同的键组合在一起。问题是,对于表中的大多数值,分组工作得很好,我无法理解它是如何可能的。如果你能以任何方式提供帮助,我们将非常感激。
答案 0 :(得分:5)
问题是TaxGroupObject
没有实现GetHashCode
和Equals
。 GroupBy
使用这些方法来确定使一个TaxGroupObject
对象与另一个GetHashCode
对象相等的原因。默认情况下,它是引用相等,而不是属性相等。
这应该可以使用What is the best algorithm for an overridden System.Object.GetHashCode?中的internal class TaxGroupObject
{
public long? EnvelopeID { get; set; }
public string PolicyNumber { get; set; }
public string TZ { get; set; }
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
hash = hash * 23 + EnvelopeID.GetHashCode();
hash = hash * 23 + (PolicyNumber != null ? PolicyNumber.GetHashCode() : -2);
hash = hash * 23 + (TZ != null ? TZ.GetHashCode() : -1);
return hash;
}
}
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TaxGroupObject))
return false;
var other = (TaxGroupObject)obj;
return this.EnvelopeID == other.EnvelopeID &&
this.PolicyNumber == other.PolicyNumber &&
this.TZ == other.TZ;
}
}
算法:
{{1}}
此外,您应该只在分组或字典之类的东西中使用不可变对象。至少,您必须确保此处的对象在分组过程中不会发生变化。
答案 1 :(得分:0)
最终我发现放弃继承并使用结构而不是类更简单,它也有效,因为struct是一个值类型,因此不需要equals方法覆盖。如果有人知道的话,我对哪种方法带来更好的表现感兴趣。直觉上似乎结构更有效,但我不确定,我目前没有时间模仿这两个选项或进行适当的重新(谷歌)搜索。
感谢