我有一份需要重新排序的记录列表。为记录分配一个组大小(通常为1到5个记录),如果其中一个记录中存在条件,则应该向上移动该记录,使其显示在当前组之前。这是我班级的简化版本:
public class Participants
{
public int ID;
public string Name;
public int Order;
public bool Override;
}
列表按顺序(升序)排序,但在参与者记录的覆盖设置为“真实”的情况下,应更改参与者的顺序,使其出现在现在的小组。例如:
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标志,但我不确定如何确定如何或在何处移动被覆盖的记录。任何帮助将不胜感激。
答案 0 :(得分:3)
您可以尝试这样的事情:
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 }