使用 C# 、 LINQ 进行排序

Posted

技术标签:

【中文标题】使用 C# 、 LINQ 进行排序【英文标题】:Sorting using C# , LINQ 【发布时间】:2018-07-26 20:17:49 【问题描述】:

我在 SharePoint 中有一个项目列表,其中包含标题、日期和优先级。我想在我的客户端应用程序上对这个集合进行排序,同时显示它,排序需要首先按日期降序,然后在一组对象中的日期,它应该按优先级对对象进行排序。

我正在使用下面的 LINQ 代码,它没有提供预期的结果。表示下面的代码没有在日期中按优先级对对象进行排序。

 var results = spObjects.OrderByDescending(n => n.Date).ThenBy(t => t.Priority);

未排序的集合如下

排序后的集合 - 期望

我正在使用 SharePoint CAML 查询,因为我从 SP 获取这些对象并且我发现在 CAML 中很难做到这一点,但我认为这可以在 C# 端使用 LINQ 来完成,不是吗?有人可以帮忙吗?

【问题讨论】:

请在您的问题中包含minimal reproducible example。没有代码,我们无法为您提供帮助 Multiple Order By with LINQ的可能重复 添加代码@maccettura @devlincarnate - 添加了代码。 【参考方案1】:

我敢打赌n.Date 是一个DateTime 对象,包含小时、分钟和秒。您的 Linq 看起来不错,因此您可能有不同的时间导致当天晚些时候优先级较低的项目排在当天早些时候的项目之前。

尝试类似:

 var results = spObjects.OrderByDescending(n => new DateTime(n.Date.Year, n.Date.Month, n.Date.Day)).ThenBy(t => t.Priority);

【讨论】:

【参考方案2】:

如果我理解正确,您希望在日期标题下有一个嵌套集合,您可以这样做...

 var results = from so in spObjects
               orderby so.Date descending
               select new 
                    Date = so.Date,
                    Items = (from so2 in spObjects
                             where so2.Date == so.Date
                             orderby so2.Priority
                             select new 
                                  so2.Title,
                                  so2.Priority
                             )
                    ;

【讨论】:

感谢回复,我试过了,不行。一旦它按日期降序排序,然后在该日期内,我需要按优先级升序排序。 子句“orderby so2.Priority”的目的是专门为嵌套查询中的优先级提供升序排序。 是的,检查过,但不幸的是它不适合我。对我来说 Priority 是一个具有 Urgent=1, Regualar =2 的枚举。但我不认为这有什么不同,是吗? 不,这没关系,因为枚举在数据库中表示为 int。你能真正检查数据库并确保优先级设置正确吗?也许您在显示枚举的代码上有问题?

以上是关于使用 C# 、 LINQ 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 按名称频率对列表进行排序

使用动态 LINQ 按一个或多个属性对 JSON 进行排序

在 C# 中使用 LINQ 按范围排序列表

C# LINQ 组按属性集合,然后按列表定义的显式顺序对每个组进行排序[重复]

C# linq 字段排序如何排除0从1开始排序

C# LINQ Orderby - 真/假如何影响 orderby?