如何通过查询获取此Linq组中的月份名称?

时间:2013-10-21 12:40:59

标签: c# linq

我在LINQ中使用此查询来获取分组数据:

string fmt = "yyyyMM";
var pivotedMeanResults =
    meanDataResults
    .GroupBy(i => i.Description)
    .Select(g => new PivotedMeanData
    {
        Description = g.Key,
        Month3Value = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, fmt, invariantCulture).Month == currentMonth - 3).FirstOrDefault().LabResultNo.ToString(),
        Month2Value = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, fmt, invariantCulture).Month == currentMonth - 2).FirstOrDefault().LabResultNo.ToString(),
        Month1Value = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, fmt, invariantCulture).Month == currentMonth - 1).FirstOrDefault().LabResultNo.ToString()
        Month3Name = ? //
        Month2Name = ? //
        Month1Name = ? //
    }).ToList();

数据采用以下格式:

Item    Collection_Period   Value
====    =================   =====
Item4       201308          19
Item3       201209          2.1
Item2       201307          345
Item1       201309          13.11
Item2       201308          34
Item4       201308          58.2
Item3       201209          2.4
Item2       201309          12.1
Item1       201209          12.3

我需要将数据操作为这种格式,我根据需要获取该格式:

Item    Month3Name  Month2Name  Month1Name
=====   =========   =========   =========
Item1                           13.11
Item2   345         34          12.1
Item3   
Item4   19          58.2

但我想知道是否可以根据分组中派生的等效月份值来获取月份名称(Month1Name,Month2Name,Month3Name)?


PS:我知道我可以像这样生成月份名称:

CultureInfo cInfo = new CultureInfo("en-US");
DateTimeFormatInfo english = cInfo.DateTimeFormat;
english.GetAbbreviatedMonthName(integer)

所以我试过这个

Month3Name = english.GetAbbreviatedMonthName
(g.Where(DateTime.ParseExact(c.CollectionPeriod, fmt, invariantCulture)
.Month == currentMonth - 3))

但我得到错误:

  

参数1:无法从'System.Collections.Generic.IEnumerable <Namespace.Type.MeanData>'转换为'int'

     

'System.Globalization.DateTimeFormatInfo.GetAbbreviatedMonthName(int)'的最佳重载方法匹配有一些无效的参数

2 个答案:

答案 0 :(得分:1)

您想要当前月份的名称-1,-2,-3。

那你为什么要从你的数据子集中获取月份名称?

Month3Name = english.GetAbbreviatedMonthName(currentMonth - 3)

似乎更有可能给你一个月份名?

是的,你不能从1月份减去2并期望有效的月份:)

答案 1 :(得分:0)

只需格式化以下日期即可;它将返回日期的月份名称。

        string month = DateTime.Now.ToString("MMMM", new CultureInfo("en-US"));
        //or
        month = new DateTime(1, 3, 1).ToString("MMMM", new CultureInfo("en-US"));