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