按月份名称和年份(MMM yyyy字符串)排序的LINQ。

4
我该如何在linq中按月份名称和年份排序?目前它是按字母顺序排序,这在报告显示时会导致问题。
我想要的结果是2011年11月,2011年12月,2012年1月,2012年2月。
我的主要问题是MonthList的结果,因为它是monthlist1和monthlist2的联合。
感谢您的帮助和见解。
var monthlist1 = data.
    Select(x => new { wkdate = x.WKENDDATE }).
    OrderBy(y => y.wkdate).
    Select(m => new { 
        monthname = m.wkdate.ToString("MMM yyyy", 
                                      CultureInfo.CreateSpecificCulture("en-US")) 
        }).
    Distinct().
    ToList();

var monthlist2 =
    data.Select(x => new { wkdate = 
          ExportHelper.getSplitEndDate(x.WKENDDATE).AddDays(1)})
         .OrderBy(y => y.wkdate)
         .Where(l => ExportHelper.isSplitWeek(l.wkdate.AddDays(-6), l.wkdate) == true)
         .Select(m => new { 
                   monthname = m.wkdate.ToString("MMM yyyy", 
                   CultureInfo.CreateSpecificCulture("en-US")) 
               })
              .Distinct()
              .ToList();

var monthlist = 
    monthlist1.
    Union(monthlist2).
    Distinct().
    OrderBy(m=> m.monthname).
    ToList(); 

2
请将您的问题中的代码格式化,使其更易读。最好不要出现水平滚动条。 - Daniel Hilgarth
你对当前代码有什么问题? - mellamokb
1
按月份名称按字母顺序排序 - HELP_ME
所以,你想要 四月、八月、十二月…… 等等吗? - Jodrell
在合并之后,先不要对日期进行格式化。 - Jodrell
显示剩余4条评论
3个回答

7

这是按字母顺序排序,因为 wkdate 是一个 String 值而不是一个 DateTime。您需要先解析它:

var monthlist = monthlist1.Union(monthlist2)
    .Distinct()
    // monthname is a String in format MMM yyyy
    .OrderBy(m => DateTime.Parse(m.monthname))
    .ToList();

我假设你当前的 wkdate 值遵循 MMM yyyy 的格式(例如 Apr 2012),它们都可以正确解析。我知道这是一个大胆的假设。

你还需要将这些值格式化为 String 表示以获得最终结果。


问题出在 monthlist 上,我正在进行联合操作,因为这是我的主要结果集,这会有帮助吗? - HELP_ME
@bugz 你说得对-只有最后的 Union() 需要更改。请尝试使用更新后的示例。 - Yuck
谢谢Yuck,我从你的回答中得到了按月排序的解决方案。 - Anand Thakkar

0

类似于某事

var monthlist1 = data.Select(m => new DateTime(m.WKENDDATE.Year,
                                                 m.WKENDDATE.Month,
                                                 1);

var monthlist2a = 
    data.Select(x => 
        new { wkdate = ExportHelper.getSplitEndDate(x.WKENDDATE).AddDay(1)})
    .Where(l => 
        ExportHelper.isSplitWeek(l.wkdate.AddDays(-6), l.wkdate) == true);

var monthlist2b = monthlist2a.Select(m => new DateTime(m.WKENDDATE.Year,
                                                 m.WKENDDATE.Month,
                                                 1);


var monthlist = monthlist1.Union(monthlist2b).Distinct()
                 .OrderBy(m => (m.Year * 100) + m.Month)
                 .Select(m => 
        m.ToString("MMM yyyy", CultureInfo.CreateSpecificCulture("en-US"));

这样可以避免不必要的格式化和解析。

0
var monthlist1 = data.
    Select(x => new { wkdate = x.WKENDDATE }).
    OrderBy(x=> CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Month)).
    ThenBy(x=> x.Year).
    Select(m => new { 
        monthname = m.wkdate.ToString("MMM yyyy", 
                                      CultureInfo.CreateSpecificCulture("en-US")) 
        }).
    Distinct().
    ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接