基于元素变量和元素位置的拆分列表

本文关键字:元素 位置 拆分 列表 于元素 变量 | 更新日期: 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上查看它如何应用于您的案例。