在通用列表中重新排序

时间:2014-10-06 23:23:46

标签: c#

我有一份需要重新排序的记录列表。为记录分配一个组大小(通常为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标志,但我不确定如何确定如何或在何处移动被覆盖的记录。任何帮助将不胜感激。

1 个答案:

答案 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 }