我有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
对此列表进行排序?
谢谢!
答案 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)
。这样您只需遍历列表一次。