2016-10-10 54 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_,但是在具有单独数据的行的某处可能会有用。我不想为了“我现在不需要那些东西”而烧毁任何桥梁。 –