条件排序by in linq

本文关键字:linq in by 排序 条件 | 更新日期: 2023-09-27 18:17:53

我有如下的ViewModel

public class LMS_ClassDiscussionListViewModel
{
    public  int ReplyCount { get; set; }
    public LMS_ClassDiscussion ClassDiscussion { get; set; }
}

和上面视图模型中引用的LMS_ClassDiscussion模型如下

public partial class LMS_ClassDiscussion
{
    [Key]
    public int ClassDiscussionID { get; set; }
    public int? ParentClassDiscussionID { get; set; }
    public int MessageTypeID { get; set; }
    public int ClassID { get; set; }
    public int DiscussionUserID { get; set; }
    public int NotificationStatusID { get; set; }
    public string Discussion { get; set; }
    public DateTime DiscussionDate { get; set; }
    public bool IsPrivate { get; set; }
    public bool IsRead { get; set; }
    public string DiscussionTitle { get; set; }
}

我正在获取列表中的记录如下

List<LMS_ClassDiscussionListViewModel> modelList = GetData();

所以,我想根据NotificationStatusID = 2对这个列表进行排序。

表示NotificationStatusID为2的记录应该先出现,然后再出现。

所以,对于这个,我已经尝试了下面的方式,但列表没有得到排序

modelList = modelList.OrderBy(x => x.ClassDiscussion.NotificationStatusID)
                     .ThenBy(x => x.ClassDiscussion.NotificationStatusID == 2)
                     .ToList();

如何用NotificationStatusID = 2对这个列表进行排序?

谢谢!

条件排序by in linq

您可以首先选择Id = 2的元素,然后在最后使用Enumerable.Concat:

将其余的连接起来。
var result = modelList.Where(x => x.ClassDiscussion.NotificationStatusID == 2)
        .Concat(modeList.Where(x => x.ClassDiscussion.NotificationStatusID != 2));

您正在做的是按NotificationStatusID作为主要排序标准进行排序,这将使所有内容按顺序排列。然后在该订单中,您按NotificationStatusID == 2订购。

你能做的是编写一个比较器,实现IComparer<int>,并将所有值为2的元素放在列表的顶部。然后你可以在SortBy中使用这个比较器(有一个重载)。

如果你想保存比较器,试试这个:

modelList = modelList.OrderBy(x => x.ClassDiscussion.NotificationStatusID == 2 ? Int32.MinValue : x.ClassDiscussion.NotificationStatusID)

将所有值为2的元素视为Int32。

假设你没有否定,你可以做一个.OrderBy(m => m.ClassDiscussion.NotificationStatusID == 2 ? -1 : m.ClassDiscussion.NotificationStatusID)。这样你只需要遍历列表一次。