c# - GroupBy 项目不相等

标签 c# .net linq group-by equality

我正在遍历可枚举的 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 的检查。我可以看到变量 groupgrouping.Last() 之间的哈希码在监 window 口中是不同的,但同样,我不确定这是为什么。如果有人可以澄清为什么会发生这种情况,我想知道吗?

最佳答案

因为 grouping 是一个延迟执行的 LINQ 查询,它在 grouping.Last() 的循环中再次执行。这将创建内部类的新实例 Grouping ,所以 Object.ReferenceEquals 永远不会返回 true

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

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

如果在 documentation 中发现“This method is implemented by using deferred execution”这句话要小心.这意味着你得到的不是一个集合,而是一个“查询”,如果你使用它,它将始终被执行(例如通过使用 foreach 循环,或非延迟方法,如 First/LastToArray/ToList)。 但是,如果您附加其他延迟方法,如 SelectWhereOrderBy,它将不会被执行。然后您只是在构建最终的查询

关于c# - GroupBy 项目不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57787348/

相关文章:

c# - 何时抛出异常以及何时优雅地处理问题

c# - Windows 10 IOT Raspberry PI 上的 ASP.NET MVC Web 应用程序

c# - 从 Mono 应用程序与 CLI 应用程序交互

linq - 使用(Linq for JavaScript 库)子查询(操作方法)

c# - 使用 SimpleInjector 动态选择具有名称的具体对象

c# - 如何对该方法进行单元测试

c# - 我怎样才能在C#中将元素插入到队列中

c# - 无法将参数传递给API

c# - 我如何修改此 C# 代码,以便 Visual Studio 识别出我不是白痴?

linq - 您将如何编写LINQ to SQL的Upsert?