列出队列处理的重新排序

本文关键字:排序 新排序 队列 处理 | 更新日期: 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");