在常规列表中重新排序
本文关键字:排序 新排序 常规 列表 | 更新日期: 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 }