2016-10-10 56 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中創建一個新的IGroup?

+4

爲什麼你要組一個類型,然後更改密鑰,而不是隻是按照你實際想要擁有的鑰匙進行分組? – Servy

+4

只需使用'o => new YearMonth(o.Date.Year,o.Date.Month)'代替...只要'YearMonth'適當地覆蓋'Equals'和'GetHashCode',那應該沒問題...至少對於LINQ to Objects而言。 –

+2

這是'readonly'有一個很好的原因,你不應該稍後修改什麼是用來識別相同的對象。 –

回答

1

親自爲此,我只是對字符串值進行分組,因爲這似乎是您真正關心的關鍵。

另一個簡單的辦法是通過使用恆天創建表示當月日期:

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

然後你有內置的價值平等和字符串格式化。

可以使YearMoth不變結構,這也會給你價值平等的語義:

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

您是否在意字符串值以外的任何內容?你需要分開的月份和年份嗎?字符串與任何其他類型的分組鍵一樣有效,只要您不需要擔心區分大小寫,空格等等。由於_you_控制字符串格式,這些都不是問題。就像我說的那樣,直到我有一個令人信服的理由去做不同的事情,我纔會這樣做。 –

+0

我認爲字符串是我需要的_right_,但是在具有單獨數據的行的某處可能會有用。我不想爲了「我現在不需要那些東西」而燒燬任何橋樑。 –