Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询,根据日期对列表进行排序并获得不同的结果_C#_Linq - Fatal编程技术网

C# Linq查询,根据日期对列表进行排序并获得不同的结果

C# Linq查询,根据日期对列表进行排序并获得不同的结果,c#,linq,C#,Linq,我的清单如下所示: List<MyObjects> list: list[0] - Id: 1; RefId:101; Date:22/06/2016 list[1] - Id: 2; RefId:102; Date:24/06/2016 list[2] - Id: 3; RefId:101; Date:26/06/2016 list[3] - Id: 4; RefId:103; Date:28/06/2016 列表: 列表[0]-Id:1;RefId:101;日期:2016年6月

我的清单如下所示:

List<MyObjects> list:
list[0] - Id: 1; RefId:101; Date:22/06/2016
list[1] - Id: 2; RefId:102; Date:24/06/2016
list[2] - Id: 3; RefId:101; Date:26/06/2016
list[3] - Id: 4; RefId:103; Date:28/06/2016
列表:
列表[0]-Id:1;RefId:101;日期:2016年6月22日
列表[1]-Id:2;RefId:102;日期:2016年6月24日
列表[2]-Id:3;RefId:101;日期:2016年6月26日
列表[3]-Id:4;RefId:103;日期:2016年6月28日
我需要一个linq查询,它根据具有最新日期的RefId来区分我,如下所示:

List<MyObjects> newList:
list[0] - Id: 3; RefId:101; Date:26/06/2016
list[1] - Id: 2; RefId:102; Date:24/06/2016
list[2] - Id: 4; RefId:103; Date:28/06/2016
List新列表:
列表[0]-Id:3;RefId:101;日期:2016年6月26日
列表[1]-Id:2;RefId:102;日期:2016年6月24日
列表[2]-Id:4;RefId:103;日期:2016年6月28日
此处重复RefId-101,但其第一个日期值是旧的,因此被删除。
提前感谢。

使用Linq Group by
RefId
然后在
日期之前订购每组,然后从每组中首先取出:

list.GroupBy(x => x.RefId).Select(x => x.OrderByDescending(y => y.Date).FirstOrDefault());
或使用查询语法:

List<MyObjects> results = (from x in list
                            group x by x.RefId into grp
                            select grp.OrderByDescending(y => y.Date).FirstOrDefault()
                            ).ToList();
List results=(从列表中的x开始)
按x分组。重新填充到grp中
选择grp.OrderByDescending(y=>y.Date).FirstOrDefault()
).ToList();

您可以使用
GroupBy
RefId
分组,然后按
Date
对这些组进行排序,并取第一组:

var result = list.GroupBy(o => o.RefId)
      .Select(g => g.OrderByDescending(gx => gx.Date).First())
      .ToList();

由于您需要最新的
日期
,因此需要
按降序排序

我认为最好避免调用
.FirstOrDefault()
。这里有一个替代方案:

var newList =
    list
        .GroupBy(x => x.RefId)
        .SelectMany(x => x.OrderByDescending(y => y.Date).Take(1))
        .ToList();

令人惊叹的感谢老兄为什么要避免FirstOrDefault,如果有任何数据,那么Take(1)将执行FirstOrDefault(获取第一个值)@MrinalKamboj-这是一个区别
.FirstOrDefault()
始终生成值,而
.Take(1)
生成0或1值
.Take(1)
也可以很容易地概括为
。Take(n)
因此,如果您习惯了使用它,它会更强大。另外,在这种情况下,肯定会有一个值,所以
.First()
会起作用,所以使用
.FirstOrDefault()
有点草率。我知道,我最初的印象是你甚至不赞成First()。FirstOrDefault()可能不是最好的usage@MrinalKamboj-不,我不喜欢
。首先,我也不喜欢
。:-)根据我的理解,@Enigmativity的解决方案是最好的,因为您收到的结果是IEnumerable,而不是IEnumerable@RenéVogt。我的错误,抱歉,这也会导致正确的解决方案,删除我的最后一条评论,我在代码中没有使用First