所以我有一个简单的类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还是仅使用几个周期?我确信有一个非常简单的解决方案,我错过了......
答案 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();