GroupBy 项不相等

No equality on GroupBy item

提问人:Karl Morosiuk 提问时间:9/4/2019 最后编辑:Dariusz WoźniakKarl Morosiuk 更新时间:9/4/2019 访问量:125

问:

我正在遍历一个枚举项,并对每个条目执行相等性检查。但是,在单步执行此代码时,我可以看到从未满足相等性检查。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))

这解决了问题,但我不明白为什么没有满足检查。我可以看到变量和之间的哈希码在监视窗口中是不同的,但同样,我不确定为什么会这样。如果有人能澄清为什么会发生这种情况,我想知道吗?IGroupinggroupgrouping.Last()

C# .NET LINQ 组 - 按 等式

评论


答:

3赞 Tim Schmelter 9/4/2019 #1

因为是一个延迟执行的 LINQ 查询,该查询在 的循环中再次执行。这将创建内部类 T分组的新实例,因此永远不会返回 .groupinggrouping.Last()Object.ReferenceEqualstrue

您可以将它们添加到集合中,例如,通过附加:ToList

var grouping = readings.GroupBy(i => i.Label).ToList();

如果您在文档中找到“此方法使用延迟执行实现”这句话,请小心。这意味着你得到的不是集合,而是一个“查询”,如果你使用它,它将始终被执行(例如,通过使用循环,或像/或/这样的非延迟方法)。 但是,如果您附加其他延迟方法,例如 ,否则它将不会被执行。然后,您只是在构建最终查询foreachFirstLastToArrayToListSelectWhereOrderBy

评论

0赞 Karl Morosiuk 9/4/2019
谢谢,这是有道理的。我通过调用调用了分组,现在可以工作了。ToList