提问人:Karl Morosiuk 提问时间:9/4/2019 最后编辑:Dariusz WoźniakKarl Morosiuk 更新时间:9/4/2019 访问量:125
GroupBy 项不相等
No equality on GroupBy item
问:
我正在遍历一个枚举项,并对每个条目执行相等性检查。但是,在单步执行此代码时,我可以看到从未满足相等性检查。IGrouping
namespace EqualityGroupingTest
{
public class Reading
{
public int Id { get; set; }
public string Label { get; set; }
public int Measurement { get; set; }
}
class Program
{
static void Main(string[] args)
{
var readings = new List<Reading>()
{
new Reading() {Id = 1, Label = "A101", Measurement = 3},
new Reading() {Id = 2, Label = "A101", Measurement = 5},
new Reading() {Id = 3, Label = "A101", Measurement = 8},
new Reading() {Id = 4, Label = "A102", Measurement = 2},
new Reading() {Id = 5, Label = "A102", Measurement = 5},
new Reading() {Id = 6, Label = "A102", Measurement = 9}
};
var offset = -1;
var grouping = readings.GroupBy(i => i.Label);
foreach (var group in grouping)
{
var range = (group.Last().Measurement - group.First().Measurement);
if(group.Equals(grouping.Last()))
{
range += offset;
}
}
}
}
}
检查我是否正在查看最后一个分组的代码永远不会得到满足。我可以从以下位置更改此代码:
if(group.Equals(grouping.Last()))
自:
if(group.Key.Equals(grouping.Last().Key))
这解决了问题,但我不明白为什么没有满足检查。我可以看到变量和之间的哈希码在监视窗口中是不同的,但同样,我不确定为什么会这样。如果有人能澄清为什么会发生这种情况,我想知道吗?IGrouping
group
grouping.Last()
答:
3赞
Tim Schmelter
9/4/2019
#1
因为是一个延迟执行的 LINQ 查询,该查询在 的循环中再次执行。这将创建内部类 T分组
的新实例,因此永远不会返回 .grouping
grouping.Last()
Object.ReferenceEquals
true
您可以将它们添加到集合中,例如,通过附加:ToList
var grouping = readings.GroupBy(i => i.Label).ToList();
如果您在文档中找到“此方法使用延迟执行实现”这句话,请小心。这意味着你得到的不是集合,而是一个“查询”,如果你使用它,它将始终被执行(例如,通过使用循环,或像/或/这样的非延迟方法)。
但是,如果您附加其他延迟方法,例如 ,否则它将不会被执行。然后,您只是在构建最终查询。foreach
First
Last
ToArray
ToList
Select
Where
OrderBy
评论
0赞
Karl Morosiuk
9/4/2019
谢谢,这是有道理的。我通过调用调用了分组,现在可以工作了。ToList
评论