gpt4 book ai didi

linq - 按匿名与分组分组按非匿名分组

转载 作者:行者123 更新时间:2023-12-04 18:00:56 24 4
gpt4 key购买 nike

我需要在一些数据从服务器到达后对其进行分组。

var result = context.GetData();

Assert.Equal(54, result.Count); // OK

var transactions = result.GroupBy(t => new //BeneficiaryGroup
{
BankAcronym = t.BankAcronym.Substring(4, 4),
DebitDate = t.DebitDate,
Key = t.Key
})
.OrderBy(g => g.Key.BankAcronym)
.ThenBy(g => g.Key.DebitDate)
.ThenBy(g => g.Key.Key)
.ToList();

Assert.Equal( 14, transactions.Count ); // OK

当我按匿名对象分组时,分组是正确完成的。

当我按具有完全相同属性的 BeneficiaryGroup 对象分组时

public class BeneficiaryGroup 
{
BankAcronym,
DebitDate,
Key
}

分组未正确完成 - 该组有 54 条记录,与分组前一样。

我想按类对数据进行分组,这样我就可以向 API 使用者返回一个已经分组的集合。

知道为什么会出现这种奇怪的行为吗?

最佳答案

匿名类型“免费”获得“明智的”相等行为,这就是分组在这种情况下按预期工作的原因。当您切换到使用命名类时,作为类定义者,您有责任提供相等行为,以允许 BeneficiaryGroup以您期望的方式用作分组键。


正如 the docs for GroupBy 中所说,

The default equality comparer Default is used to compare keys.

哪里Default EqualityComparer<T>.Default ,这解释了:

The Default property checks whether type T implements the System.IEquatable<T> interface and, if so, returns an EqualityComparer<T> that uses that implementation. Otherwise, it returns an EqualityComparer<T> that uses the overrides of Object.Equals and Object.GetHashCode provided by T.

for an anonymous type ,

Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashCode methods of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

而对于不会覆盖Equals的命名类型和 GetHashCode , 你会得到 Object实现,通常没有用。

关于linq - 按匿名与分组分组按非匿名分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35598386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com