1

オブジェクトのプロパティに基づいてグループ化したいリストがあります。しかし、グループ化されたリストを出力すると、値を割り当てなくても、オブジェクト内のすべてのプロパティでグループ化されるようです。割り当てられていない値のデフォルト値は同じである必要があるため、グループ化する必要があります。

匿名型(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; }
    }
4

1 に答える 1

1

現在のコードがグループ化されていることに気付いたら、私は驚きます。Equals現在のグループ化キータイプは、またはをオーバーライドしないクラスGetHashCodeです。つまり、基本的に参照の同等性が得られます。のすべてのインスタンスはGroupProperties他のすべてのインスタンスと等しくなく、それぞれに新しいインスタンスを作成するMessageと、グループ化は行われません。

これらのメソッドを適切にオーバーライドする(理想的には実装するIEquatable<GroupProperties>)必要があります。そうすれば、グループ化が機能します。キー抽出関数が常に一貫したプロパティのセットを設定している限り、どのプロパティが設定されているかを気にする必要はありません。

于 2012-09-19T17:01:47.813 に答える