条件排序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
对这个列表进行排序?
谢谢!
您可以首先选择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)
。这样你只需要遍历列表一次。