基于元素变量和元素位置的拆分列表
本文关键字:元素 位置 拆分 列表 于元素 变量 | 更新日期: 2023-09-27 18:27:22
嘿,我正试图根据元素的bool是否为true来拆分列表。但每次它通过一些true,遇到false时,我希望它也用所有false开始一个新的列表,直到它再次遇到true,以此类推。所以基本上对false和true的序列进行分组
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可能位于列表中被"剪切"的中间位置,因此我剩余的"外墙"在其列表的第一个和最后一个网格中仍然具有相同的节点索引,仍然透支了我的"内壁"
比方说每个节点!标记为ForDoor的节点为0,标记为ForDoor的每个节点为1,他们在我的列表中排序如下。像这样:
|000|111111|00000|11|000|如何获得|…|之间的每个列表?
我该如何用一种简单的方法做到这一点。我以为林克会为此有所收获,但什么也找不到。
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;
}
以下是一种简单的方法(无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));
}
MSDN上按连续键查找组结果。在Rextester上查看它如何应用于您的案例。