列出队列处理的重新排序
本文关键字:排序 新排序 队列 处理 | 更新日期: 2023-09-27 18:20:35
在处理我的项目时,List的工作方式遇到了一个小故障。
我有这个列表,例如:
# Username - Status - Order - Timestamp
Admin, Available (int 0), 2, 10:45
User1, Not available (int 2), 1, 10:44
User2, Available, 3, 10:52
User3, Busy (int 1), 4, 10:33
我想要一种使用比较器之类的东西按多个属性排序的方法。
我希望它按状态排序,所以Available是第一位的,然后按Timestamp来知道谁是列表中的第一位。
所以它会输出:
Admin, 0, 0, 10:45
User2, 0, 1, 10:52
User3, 1, 2, 10:33
User1, 2, -1, 10:44
User1顺序必须变为-1,因为它不可用,所以我希望它显示在我的列表中的最后一个,因为繁忙的用户就在前面。
我需要维持秩序,因为我想知道下一个是谁。我试图通过对旧列表进行排序来迭代它,然后创建一个具有良好顺序的新列表,但它不起作用。
这是我使用的方法:
public static List<ListMember> ReOrder(this List<ListMember> list)
{
int Index = 0;
List<ListMember> newList = new List<ListMember>();
foreach (ListMember member in list.OrderBy(x => x.ListOrder).ThenBy(x => x.DateEntered))
{
if (member.DateExited == null)
{
member.ListOrder = Index;
Index++;
}
else
{
member.ListOrder = -1;
}
newList.Add(member);
}
return newList;
}
这是必要的,因为当有人从状态1转到0时,他就可以上场了,但我不希望他先上场,我希望他在列表中排名最后,然后重新索引列表。
有人知道如何对列表进行大量排序吗。
Sinatr的注释应该有效。
只要你只需要可用的物品,你也可以做:
myList.Where(x => x.Status == 0).OrderBy(y => y.Timestamp)
我猜先做"Where"会返回一个较短的列表,然后orderBy会更快地执行(有人确认?)
编辑
在你编辑后,我建议你这样做:
public static List<ListMember> ReOrder(this List<ListMember> list)
{
int Index = 0;
foreach (ListMember member in list.OrderBy(x => x.DateEntered))
{
if (member.DateExited == null)
{
member.ListOrder = Index;
Index++;
}
else
{
member.ListOrder = -1;
}
}
return list;
}
我认为您不需要创建一个新列表来更新字段。只需直接在列表中更新即可。
我还建议你不要经常调用这个函数,因为如果你的列表中有很多项目,这可能需要时间!您应该在ListMember
类中创建一个函数"SetDateExit"。可能是:
public void SetDateExit(DateTime dateExit)
{
this.DateExited = dateExit;
this.ListOrder = -1;
}
然后,当你需要显示你的结果时,就这样做:
return myList.Where(x => ListOrder != -1).OrderBy(x => x.ListOrder);
您可以使用动态LINQ按多个字段排序。使用Linq.Dynamic和NuGet(https://www.nuget.org/packages/System.Linq.Dynamic.Library/)可以使用逗号分隔的值来订购
myList.OrderBy("Availibility,Timestamp");