linq中的条件顺序

时间:2016-11-15 09:07:39

标签: c# linq asp.net-core-mvc

我有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对此列表进行排序?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以先选择Id = 2的元素,然后使用Enumerable.Concat将其余元素连接起来:

var result = modelList.Where(x => x.ClassDiscussion.NotificationStatusID == 2)
        .Concat(modeList.Where(x => x.ClassDiscussion.NotificationStatusID != 2));

答案 1 :(得分:2)

您正在做的是按NotificationStatusID排序作为主要的排序标准,这将使一切井然有序。然后在该订单中,您按NotificationStatusID == 2订购。

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

如果您想保存比较器,请尝试以下方法:

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

这会将值为2的所有元素视为Int32.MinValue,这会将它们向右移动。

答案 2 :(得分:2)

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