在常规列表中重新排序

本文关键字:排序 新排序 常规 列表 | 更新日期: 2023-09-27 18:25:41

我有一个需要重新排序的记录列表。记录被分配了一个组大小(通常为1到5条记录),如果其中一条记录中存在条件,则应将该记录上移,使其出现在当前组之前。这是我的课程的简化版本:

public class Participants
{
    public int ID;
    public string Name;
    public int Order;
    public bool Override;
}

列表按顺序(升序)排序,但在参与者记录的"覆盖"设置为"true"的情况下,应更改参与者的顺序,使其显示在当前组之前。例如:

Name | Order | Override
John |   1   |   False
Jane |   2   |   False
Ben  |   3   |   False
Carl |   4   |   True
Jim  |   5   |   False

如果指定的组大小为2,则John和Jane在第一组,Ben和Carl在第二组。但由于卡尔的联系记录已经设置了超控标志,他应该被移动到位置3,这给出了以下显示顺序:

Name | Order | Override
John |   1   |   False
Jane |   2   |   False
Carl |   3   |   True
Ben  |   4   |   False
Jim  |   5   |   False

如果指定的组大小是3,那么John、Jane和Ben在第一组,Carl被移到位置1,其他人都被推倒。

这就是我被卡住的地方。我可以循环浏览我的列表并检查Override标志,但我不确定如何确定如何或在哪里移动被覆盖的记录。任何帮助都将不胜感激。

在常规列表中重新排序

你可以试试这样的东西:

int groupSize = 2;
var list = new List<Participants>();
list.Add(new Participants { Name = "John", Order = 1, Override = false });
list.Add(new Participants { Name = "Jane", Order = 2, Override = false });
list.Add(new Participants { Name = "Ben", Order = 3, Override = false });
list.Add(new Participants { Name = "Carl", Order = 4, Override = true });
list.Add(new Participants { Name = "Jim", Order = 5, Override = false });
// Group results every 2 records and
// order them by Override (true to false) then Order (ascending)
var ord = list.Select((o, i) => new { o = o, index = i }).GroupBy(o =>
{
    return o.index / groupSize;
}
, o => o.o
, (k, l) => l.OrderByDescending(o => o.Override).ThenBy(o => o.Order)).ToList();

这将给你3个枚举

[0] { John, Jane }
[1] { Carl, Ben }
[2] { Jim }

如果你想的话,你可以把的结果压平

var flatten = ord.SelectMany(o => o).ToList();

这将导致

{ John, Jane, Carl, Ben, Jim }