列出队列处理的重新排序

时间:2015-11-04 15:51:00

标签: c# list

在处理我的项目时,我遇到了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

我希望有一种方法可以使用像比较器这样的多个属性对它进行排序。

我希望按状态排序,因此“可用”排在首位,然后由“时间戳”知道谁是列表中的第一位。

所以它会输出:

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时,他变得可用,但我不希望他先走,我希望他在列表中排在最后,然后重新索引列表。

是否有人知道如何对列表进行大量订购。

2 个答案:

答案 0 :(得分:2)

Sinatr的评论应该有效。

只要您只需要可用的项目,您也可以这样做:

myList.Where(x => x.Status == 0).OrderBy(y => y.Timestamp)

我猜测要做&#34;哪里&#34;首先会返回一个较短的列表,然后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类,&#34; SetDateExit&#34;中创建一个函数。它可能是:

public void SetDateExit(DateTime dateExit)
{
    this.DateExited = dateExit;
    this.ListOrder = -1;
}

然后,当你需要显示你的结果时,就这样做:

return myList.Where(x => ListOrder != -1).OrderBy(x => x.ListOrder);

答案 1 :(得分:0)

您可以使用动态LINQ按多个字段进行排序。使用Linq.Dynamic和NuGet(https://www.nuget.org/packages/System.Linq.Dynamic.Library/),您可以使用逗号分隔值来订购

myList.OrderBy("Availibility,Timestamp");