基于元素变量和元素位置

时间:2015-12-19 20:42:54

标签: c# linq list split

嘿,我正在尝试根据元素的bool是否为真来拆分列表。但是每次它传递了一些真实的并且遇到了一个错误我想要它也开始一个新的列表与所有的错误,直到它再次遇到真,等等。所以基本上将愚蠢和真实的序列分组

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会有一些东西,但找不到任何东西。

3 个答案:

答案 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