【问题标题】:LINQ GroupBY Query returns different answersLINQ GroupBY 查询返回不同的答案
【发布时间】:2022-12-17 13:12:23
【问题描述】:

我对 LINQ GroupBy 函数有疑问。我注意到,虽然使用了相同的分组函数,但结果因模型而异。

我从数据库中读取了很多数据集到一个称为数据的变量中。此列表包含约 12.000 个元素,我想按卡 ID、日期以及用户的名字和姓氏对其进行分组。问题是,当我使用像下面的 GroupListModel 这样的“模型”时,结果并不像预期的那样。

GroupListModel 如下所示:

public class GroupListModel
    {
        public string CardId { get; set; }
        public DateTime Date { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

例如,我的第一个 GroupBy 语句是:

data.GroupBy(x => new GroupListModel
{
    CardId = x.CardId,
    Date = x.Date.Value,
    FirstName = esdUsersForTheDepartments
        .Where(y=>y.CardId.Equals(x.CardId))
        .FirstOrDefault()?
        .FirstName,
    LastName = esdUsersForTheDepartments
        .Where(y => y.CardId.Equals(x.CardId))
        .FirstOrDefault()?
        .LastName
}).ToList();

我的第二个 GroupBy 语句没有模型创建方法:

data.GroupBy(x => new
{
    CardId = x.CardId,
    Date = x.Date.Value,
    FirstName = esdUsersForTheDepartments
        .Where(y => y.CardId.Equals(x.CardId))
        .FirstOrDefault()?
        .FirstName,
    LastName = esdUsersForTheDepartments
        .Where(y => y.CardId.Equals(x.CardId))
        .FirstOrDefault()?
        .LastName
}).ToList();

我注意到,声明 1 中的 Group-Function 在我看来返回了错误的结果。第二个按预期工作。

有人可以向我解释这种行为吗?

【问题讨论】:

  • 我们可以看看GroupListModel的定义吗?
  • @RomanRyzhiy - 我添加了它。
  • new {}是C#中的一种特殊的匿名类型,内部会对其进行分析,所以GroupBy()可以使用其中定义的所有属性。当你用一个具体的类替换它时,分析将不再发生,GroupBy() 将通过它们的引用而不是它们的属性来比较不同的实例。

标签: c# linq .net-6.0


【解决方案1】:

匿名对象中的相等性比较是通过比较各个属性来完成的。这是您发布的第二个示例。

已经定义的类(如 GroupListModel)的比较是通过 equals 方法完成的,在本例中是默认方法。

要产生相同的结果,您必须覆盖 Equals 方法并根据组子句中的属性实现比较

【讨论】:

  • 我应该怎么做才能让它工作?我应该覆盖 Equals 方法吗?
  • 我打字不够快。但是是的,情况确实如此,但在务实的方面,您会复制比较代码并通过这样做使其变得严格
猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
相关资源
最近更新 更多