条件才能通过LINQ
我视图模型如下条件才能通过LINQ
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));
感谢您的帮助! – Rohit
你在做什么是NotificationStatusID
为主要排序标准进行排序,这将对一切顺序。然后在该订单内,您订购NotificationStatusID == 2
。
你可以做的是编写一个比较器,它实现了IComparer<int>
,并将所有元素的值为2放在列表的顶部。然后你可以在SortBy
中使用这个比较器(对此有一个超载)。
如果你想保存自己的比较器,试试这个:
modelList = modelList.OrderBy(x => x.ClassDiscussion.NotificationStatusID == 2 ? Int32.MinValue : x.ClassDiscussion.NotificationStatusID)
这将把为2的值作为Int32.MinValue,将它们移到右上边的所有元素。
感谢您的帮助! – Rohit
假设你没有负面因素,你可以做一个.OrderBy(m => m.ClassDiscussion.NotificationStatusID == 2 ? -1 : m.ClassDiscussion.NotificationStatusID)
。这样你只需要遍历列表一次。
感谢您的帮助! – Rohit
您可以使用concat(id为2的工具项目id为2的项目列表) – aguetat