如何使用LINQ订购和修改List <cell>的内容

时间:2018-02-20 02:42:59

标签: c# list sorting

所以我有一个简单的类Cell,由坐标(X,Y)

组成
class Cell
{
    public int X { get; set; }
    public int Y { get; set; }

    public Cell(int x, int y)
    {
        X = x;
        Y = y;
    }

    /* Some methods */
}

主要创建一个单元格List<Cell> cells列表,然后使用一些随机但不重复的坐标填充单元格。约束为:X >= 1 && X <= 4,与Y相同。

然后我以这样的方式对这个列表进行排序,它将像2D锯齿状数组的索引一样排序。这就是我想出的:

cells = cells.OrderBy(c => c.X).ThenBy(c => c.Y).ToList();

在此类之后,cells将按此顺序排序,例如:

[1, 1], [1, 2], [1, 4], [2, 2], [2, 4], [4, 1], [4, 2]

所以它(有点)就像一个锯齿状阵列的索引按顺序排列。 我要做的最后一件事就是让所有的Y都顺利进行  对于每个X.我将通过使用前面的序列向您展示我的意思:

[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [4, 1], [4, 2]

^那,我想知道该怎么做。没有添加单元格,只更改了相应的X的

那我该怎么做?我应该使用LINQ还是仅使用几个周期?我确信有一个非常简单的解决方案,我错过了......

1 个答案:

答案 0 :(得分:1)

var results = cells.GroupBy(z => z.X)
    .Select(z => z.Select((y, i) => new Cell(z.Key, i + 1)))
    .SelectMany(z => z).ToList();

很可能会做你想要的。 此外,事先无需使用OrderBy / ThenBy

GroupBy将确保将具有相同X值的所有数据组合在一起。然后我们使用Select(y, i)(其中i是一个从零开始的索引)从Y生成1..n值,当有n条目给定时值X。这会生成一个可枚举的枚举数(将其视为数组数组) - SelectMany将其展平为单个可枚举数。然后ToList生成List<Cell>

如果您想避免new新的Cell个对象,那么只需更改现有的Cell个对象:

var results = cells.GroupBy(z => z.X)
    .Select(z => z.Select((y, i) =>
    {
        y.Y = i + 1; // Change the existing object
        return y;
    })).SelectMany(z => z).ToList();