LINQ -<T> 按年、月、日分组列表



我有一个简单的列表

  • T.日期=2014年4月11日,T.标题="书籍1",T.Tipology="书籍"
  • T.日期=2014年4月14日,T.标题="书籍2",T.Tipology="书籍"
  • T.日期=2015年5月2日,T.标题="Spot1",T.Tipology="Spot"
  • T.日期=2015年6月21日,T.标题="Newspaper1",T.Tipology="Newspaper"

我需要按年份、月份和日期将此列表分组如下:

  • 2014年
    • 四月
      • T.日期=2014年4月11日,T.标题="书籍1",T.Tipology="书籍"
      • T.日期=2014年4月14日,T.标题="书籍2",T.Tipology="书籍"
  • 2015年
    • 五月
      • T.日期=2015年5月2日,T.标题="Spot1",T.Tipology="Spot"
    • 六月
      • T.日期=2016年6月21日,T.标题="Newspaper1",T.Tipology="Newspaper"

因此,我将能够在foreach函数中处理数据,如:

 foreach(var year in Year)
 {
     foreach(var month in Month)
     {
         foreach(var day in Day)
         {
            Console.WriteLine(day.Item.Title);
            Console.WriteLine(day.Item.Tipology);
         }
         Console.WriteLine(month.ToString()); // With culture
     }
     Console.WriteLine(year.ToString());
 }

我如何使用(c#)LINQ做到这一点?

您可以按年份、月份和日期订购:

var sorted = list.OrderBy(x=>x.Date.Year)
                 .ThenBy(x=>x.Date.Month)
                 .ThenBy(x=>x.Date.Day);

如果你真的想把它们分组,那么你可以做一些类似的事情:

var result = from l in list
             group l by new { l.Date.Year,l.Date.Month} into g 
             select new
                   {
                     Year = g.Key.Year,
                     Month = g.Key.Month,
                     Items = g.ToList()
                    };

因此,它将为您提供每年月日期的分组数据

您可以使用嵌套组。

var groups = list
            .GroupBy(
                    d => d.Date.Year, 
                    (key, g) => g.GroupBy(
                                          d => d.Date.Month,
                                          (key2, g2) => g2.GroupBy(d => d.Date)
                                         )
                    );

您的对象可以从IComparable继承,而不仅仅是按对象排序。

您可以订购列表,然后跟踪最后一本书:

var orderedBooks = books.OrderBy(x => x.Date.Year).ThenBy(x => x.Date.Month).ThenBy(x => x.Date.Day);
Book last = null;
foreach (Book book in orderedBooks)
{
    Console.WriteLine(book.Title);
    Console.WriteLine(book.Tipology);
    if(last != null  && last.Date.Month != book.Date.Month)
        Console.WriteLine(DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(book.Date.Month)); // With culture
    if (last != null && last.Date.Year != book.Date.Year)
        Console.WriteLine(book.Date.Year.ToString()); 
    last = book;
}

相关内容

  • 没有找到相关文章

最新更新