2016-10-10 6 views
-1

IGroupingをグループ化したKeyを置き換えることはできますか?IGroupingのキーを交換しますか?

私は現在、このような匿名型によってグループ分けしています:

var groups = orders.GroupBy(o => new { o.Date.Year, o.Date.Month }); 

しかし、今、私のグループ化キーは匿名型です。私は、このグループ化キーを、定義されたタイプ "YearMonth"で置き換えて、オーバーライドされたToStringメソッドで置き換えたいと思います。

public class YearMonth 
{ 
    public int Year { get; set; } 
    public int Month { get; set; } 

    public override string ToString() 
    { 
     return Year + "-" + Month; 
    } 
} 

グループ化キーを置き換える方法はありますか?または、新しいグループ化キーを使用して既存のIGroupingから新しいIGroupingを作成しますか?

+4

をあなたが実際に持っていたいキーをグループ化するだけですか? – Servy

+4

代わりに、 'YearMonth'が' Equals'と 'GetHashCode'を適切にオーバーライドしている限り、' o => new YearMonth(o.Date.Year、o.Date.Month) 'を使ってください。少なくともLINQ to Objects用。 –

+2

それは良い理由のために 'readonly'です、後で同じオブジェクトを識別するために使用されたものを変更すべきではありません。 –

答えて

1

個人的には文字列の値をグループ化するだけです。これはキーから本当に気にしているようです。

別の簡単なオプションは、一定の日を使って、月を表す日付を作成するために、次のようになります。

orders.GroupBy(o => new DateTime (o.Date.Year, o.Date.Month, 1)) 

次にあなたが内蔵されている値の平等と文字列フォーマット。

あなたはまた価値の平等の意味を与えるYearMoth不変構造体、作ることができます:あなたは1種類にグループ化すると、その後の代わりに、キーを変更するのはなぜ

public struct YearMonth 
{ 
    public readonly int Year; 
    public readonly int Month; 

    public YearMonth(int year, int month) 
    { 
     Year = year; 
     Month = month; 
    } 

    public override string ToString() 
    { 
     return Year + "-" + Month; 
    } 
} 
+0

これはかなりよく見えます!代わりに文字列値でグループ化するのはなぜですか?この方法で、すべてのデータをそのまま、強く型付けしたものに保ちます。 –

+0

文字列の値以外は気になりませんか?あなたは月と年を別々に必要としますか?大文字と小文字の区別、空白などを心配する必要がない場合、文字列は他のタイプと同じように有効なグループ化キーです。私が言ったように、それは何かをする魅力的な理由があるまで私が何をするかです。 –

+0

私は文字列がすべて私が_right now_必要なものだと思うが、別々のデータを持つ行のどこかが役に立つかもしれない。私はただの橋を焼きたいとは思わない、「私は今は必要ない」 –

関連する問題