C# 所有强类型属性(即使是未分配的属性)上的分组列表组

C# 所有强类型属性(即使是未分配的属性)上的分组列表组,c#,linq,C#,Linq,我有一个列表,我想根据对象的属性对其进行分组。但当我输出分组列表时,它似乎会对对象中的每个属性分组,即使我没有给它们赋值。因为默认值对于未分配的值应该是相同的,所以它们应该分组在一起,对吗 我知道我可以通过使用匿名类型(new{x.SentDate.Year})之类的东西来解决这个问题,但是为了更加动态,我的想法是在PopulateMessages方法中将GroupBy函数作为参数传递 public void PopulateMessages() { List<Me

我有一个列表,我想根据对象的属性对其进行分组。但当我输出分组列表时,它似乎会对对象中的每个属性分组,即使我没有给它们赋值。因为默认值对于未分配的值应该是相同的,所以它们应该分组在一起,对吗

我知道我可以通过使用匿名类型(
new{x.SentDate.Year}
)之类的东西来解决这个问题,但是为了更加动态,我的想法是在PopulateMessages方法中将GroupBy函数作为参数传递

public void PopulateMessages()
    {
        List<Message> Messages = new DataRepository().GetMessages();

        Func<Message, GroupProperties> func = x => new GroupProperties
            {
                Year = x.SentDate.Year
            };

        IEnumerable<IGrouping<GroupProperties, Message>> GroupedMessages = Messages.OrderByDescending( x => x.SentDate )
            .GroupBy( func )
            .ToList();
    } 

    public class GroupProperties
    {
        public int Year { get; set; }
        public int Month { get; set; }
        public int Day { get; set; }
    }
public void PopulateMessages()
{
List Messages=new DataRepository().GetMessages();
Func Func=x=>newgroupproperties
{
年份=x.SentDate.Year
};
IEnumerable GroupedMessages=Messages.OrderByDescending(x=>x.SentDate)
.GroupBy(func)
.ToList();
} 
公共类GroupProperties
{
公共整数年{get;set;}
公共整数月{get;set;}
公共整数日{get;set;}
}

如果您发现当前代码根本没有分组,我会感到惊讶。您当前的分组键类型是一个不会覆盖
Equals
GetHashCode
的类,这意味着您将基本上获得引用相等。
GroupProperties
的每个实例都不等于其他每个实例,当您为每个
消息创建一个新实例时,将不进行分组


您需要适当地覆盖这些方法(理想情况下实现
IEquatable
),然后分组将起作用。您不必关心设置了哪些属性,只要您的密钥提取函数始终设置了一组一致的属性。

如果您发现当前代码根本没有分组,我会感到惊讶。您当前的分组键类型是一个不会覆盖
Equals
GetHashCode
的类,这意味着您将基本上获得引用相等。
GroupProperties
的每个实例都不等于其他每个实例,当您为每个
消息创建一个新实例时,将不进行分组


您需要适当地重写这些方法(理想情况下实现
IEquatable
),然后分组就可以了。您不必关心设置了哪些属性,只要您的密钥提取函数始终设置了一组一致的属性。

为该类实现IEquatable确实有效。非常感谢!为该类实现IEquatable确实有效。非常感谢!