public void SortWalls()
{
List<Node> innerWallNodes;
foreach(Wall w in walls)
{
WallAxis ax = w.axis;
innerWallNodes = new List<Node>();
for(int i=w.wallNodes.Count-1; i>=0; i--)
{
if(w.wallNodes[i].markedForDoor)
{
//split wall!!
innerWallNodes.Add(w.wallNodes[i]);
w.wallNodes.RemoveAt(i);
}
}
if(innerWallNodes.Count > 0)
{
Wall wall = new Wall(innerWallNodes, ax);
innerWalls.Add(wall);
}
}
}
我是这样做的,然后根据List的第一个和最后一个元素构建一个网格。但是因为有很多场景,其中innerWallNodes可能位于列表中间的“切出”的位置,因此我的剩余“外墙”仍然在我的网格中具有相同的节点索引,用于列表中的第一个和最后一个,仍然透支我的“内墙”
所以我们说每个节点!markedForDoor都是0,每个节点markedForDoor都是1,他们在我的列表中按下面的顺序排序。 像这样:
| 000 | 11111 | 00000 | 11 | 000 |我如何获得每个| ... |之间的列表?
我如何以简单的方式做到这一点。我认为Linq会有一些东西,但找不到任何东西。
答案 0 :(得分:2)
Linq没有得到帮助。这是代码:
List<List<YouObjectType>> SplitList(List<YourObjectType> listToSplit) {
List<List<YouObjectType>> listOfLists = new List<List<YourObjectType>>();
List<YourObjectType> tmp = new List<YourObjectType>();
foreach(YourObjectType item in listToSplit) {
if (tmp.Count > 0
&& tmp[tmp.Count - 1] != item) {
// Compare you items here as you wish,
// I'm not sure what kind of objects
// and what kind of comparison you are going to use
listOfLists.Add(tmp);
tmp = new List<YourObjectType>();
}
tmp.Add(item);
}
if (tmp.Count > 0) {
listOfLists.Add(tmp);
}
return listOfLists;
}
答案 1 :(得分:2)
这是一种简单的方法(没有Linq)
List<Node> input = ...;
var output = new List<List<Node>>();
for (int end = 0; end < input.Count; )
{
int start = end;
while (++end < input.Count && input[end].markedForDoor == input[start].markedForDoor) { }
output.Add(input.GetRange(start, end - start));
}
答案 2 :(得分:0)
在MSDN上查找Group Results by Contiguous keys。 请参阅Rextester上的how it applies to your case。