面试题精选04-Linq如何将数据分组并按时间降序取最新1条数据

实体类

public class Movie
{
    public string Name { get; set; }

    public string Area { get; set; }

    public DateTime ProductTime { get; set; }
}

初始化数据

public static List<Movie> InitData()
{
    List<Movie> data = new List<Movie>()
    {
        new Movie(){ Name="功夫",Area="中国香港",ProductTime=new DateTime(2004, 12, 23) },
        new Movie(){ Name="无间道",Area="中国香港",ProductTime=new DateTime(2002, 12, 12) },
        new Movie(){ Name="霍元甲",Area="中国大陆",ProductTime=new DateTime(2006, 01, 25) },
        new Movie(){ Name="我不是药神",Area="中国大陆",ProductTime=new DateTime(2018, 07, 05) },
        new Movie(){ Name="让子弹飞",Area="中国大陆",ProductTime=new DateTime(2010, 12, 16) },
        new Movie(){ Name="肖申克的救赎",Area="美国",ProductTime=new DateTime(1994, 09, 10) },
        new Movie(){ Name="阿甘正传",Area="美国",ProductTime=new DateTime(1994, 07, 06) },
        new Movie(){ Name="蜘蛛侠2",Area="美国",ProductTime=new DateTime(2004, 06, 30) },
    };
    return data;
}

方式一

 static void Main(string[] args)
 {
     List<Movie> data = InitData();

     var groupData = data.OrderByDescending(a => a.ProductTime).GroupBy(a => a.Area).Select(group => new
     {
         Area = group.Key,
         Name = group.FirstOrDefault().Name,
         ProductTime = group.FirstOrDefault().ProductTime
     });

     foreach (var item in groupData)
     {
         Console.WriteLine($"电影名称:{item.Name},上映地区:{item.Area},上映时间:{item.ProductTime.ToString("yyyy-MM-dd")}");
     }
 }

方式二

 static void Main(string[] args)
 {
     List<Movie> data = InitData();
     var groupData = data.GroupBy(a => a.Area).Select(group => group.OrderByDescending(item=>item.ProductTime).FirstOrDefault());
     
     foreach (var item in groupData)
     {
         Console.WriteLine($"电影名称:{item.Name},上映地区:{item.Area},上映时间:{item.ProductTime.ToString("yyyy-MM-dd")}");
     }
 }

方式三

static void Main(string[] args)
{
    List<Movie> data = InitData();
    var groupData = from item in data
                            orderby item.ProductTime descending
                            group item by item.Area into groupdata
                            select groupdata.FirstOrDefault();

    foreach (var item in groupData)
    {
        Console.WriteLine($"电影名称:{item.Name},上映地区:{item.Area},上映时间:{item.ProductTime.ToString("yyyy-MM-dd")}");
    }
}

image

posted @ 2024-11-20 22:26  相遇就是有缘  阅读(1)  评论(0编辑  收藏  举报