为列表中的每个项目分配一个位置,检查是否已存在

时间:2014-08-02 07:04:11

标签: c# linq loops

我有一个“盒子”列表。对列表中的每个框都有一个名为“position”的值。

当我的盒子列表被构建时,一些盒子被赋予一个位置(int)。位置是我的代码用来确定每个方框在我的页面上的位置的值。

所以,我有一个包含13个盒子的列表,我有一个位置= 13的盒子和一个位置为4的盒子。其余的盒子当前为空。

对于一个盒子,还有另一个名为“order”的字段。我现在需要做的是按“顺序”中的值排序没有“位置”值的所有内容。 (订单不可为空)。

到目前为止很容易。但是,我现在需要做的是循环返回的每个值并给它们一个位置值。但我需要跳过已经采用的位置值(目前为4和13)。

这就是我在做的事情:

                var orderedBoxes = (from a in boxes
                                    orderby a.Order
                                    where a.Position == null
                                    select a).ToList();

                List<int> takenPositions = (from a in boxes
                                      where a.Position != null
                                      select a.Position).ToList();


                foreach (var box in orderedBoxes)
                {

                    if (takenPositions.Contains(i))
                    {
                        //    i++
                        //    box.Position =i;
                    }
                    //box.Position =i;
                }

我认为这可能没问题,但是经过反思,如果takePositions包含i并且i ++之后的值也在takePositions中会怎么样?

我觉得我需要某种形式的循环来测试每次增量后i ++的结果。

任何人都可以提供任何帮助!

2 个答案:

答案 0 :(得分:1)

如果你改变了

,它可能会被解决
    if (takenPositions.Contains(i))

    while (takenPositions.Contains(i))

它会自动递增,直到找到空闲位置。

答案 1 :(得分:0)

有时我会使用旧的for循环:

int j = 0;
for (int i = 1; i <= boxes.Count; i++)
{
    if (takenPositions.Contains(i)) continue;
    orderedBoxes[j++].Position = i;
}