【问题标题】:linq order by Month Name and Year (MMM yyyy string)linq 按月份名称和年份排序(MMM yyyy 字符串)
【发布时间】:2012-04-13 13:07:05
【问题描述】:

我如何在 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(); 

【问题讨论】:

  • 请格式化您问题中的代码,使其更具可读性。理想情况下不会有水平滚动条。
  • 如果应用程序是多语言的,按月份名称排序可能会成为一个问题
  • 当前代码有什么问题?
  • 它按月份名称的字母顺序排列
  • 那么,你想要Apr, Aug, Dec ... 等等?

标签: c# asp.net linq


【解决方案1】:

它按字母顺序排序,因为 wkdateString 值,而不是 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 表示以获得最终结果。

【讨论】:

  • 问题在我正在做联合的月表上,因为这是我的主要结果集,这有帮助吗
  • @bugz 你是对的 - 只有最后的 Union() 需要更改。试用更新后的示例。
  • 谢谢你的回答,我得到了按月订购的解决方案。
【解决方案2】:
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();

【讨论】:

    【解决方案3】:

    有点像

    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"));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2012-01-24
      相关资源
      最近更新 更多