1

我正在尝试制作一个参差不齐的列表。它根据两个变量 int 填充值:rows 和 cols。

当 rows = 4 和 cols = 3 时,模式是这样填充列表:

00,
10,
20,
01,
11,
21,
02,
12,
22,
03,
13,
23

每个两位数是一个包含列的子列表,然后是行。这就是我所拥有的:

namespace WindowsFormsApplication11
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            defineCellPositionsList();
            displayCellPositionsList();
        }

        int rows = 4;
        int cols = 3;

        private List<List<int>> CellPositionsList = new List<List<int>>();

        private void defineCellPositionsList()
        {
            for (int i = 0; i < (rows * cols); i++)
            {
                List<int> sublist = new List<int>();
                for (int row = 0; row < rows; row++)
                {
                    for (int col = 0; col < cols; col++)
                    {
                        sublist.Add(col);
                        sublist.Add(row);
                    }
                }
                CellPositionsList.Add(sublist);
            }
        }

        private void displayCellPositionsList()
        {
            for (int i = 0; i < CellPositionsList.Count; i++)
            {
                label1.Text += CellPositionsList[i][0];
                label1.Text += CellPositionsList[i][1] + "\n";
            }
        }
    }
}

锯齿状列表应该有 12 个子列表。子列表应该有 2 个值。这是有效的。但是每个值都是 0。显然我对我的逻辑有点不满意。任何帮助表示赞赏。谢谢。

4

2 回答 2

2

问题不在于您的每个子列表都是{ 0, 0 },而是每个子列表都是完整的 24 个项目的子列表,恰好以数字开头0, 0。您可以通过检查来验证这一点CellPositionsList[i].Count

该错误是由于创建列表时循环过多。您不需要三个循环,两个是正确的:

private void defineCellPositionsList()
{
    for (int row = 0; row < rows; row++)
    {
        for (int col = 0; col < cols; col++)
        {
            CellPositionsList.Add(new List<int> { col, row });
        }
    }
}

而且也没有必要写所有这些速记,因为 LINQ 提供了一个恕我直言更好的选择:

CellPositionsList = Enumerable.Range(0, rows)
    .SelectMany(r => Enumerable.Range(0, cols).Select(c => new List<int> {c,r}))
    .ToList();
于 2013-09-03T22:47:57.910 回答
0

defineCellPositionsList()似乎sublist每次迭代都使用相同的。中的前两个元素sublist0, 0,但最终总共添加了 24 个。

要解决此问题,请sublist在第一个循环内移动声明。

我确实在子列表中看到了很多非零值。值得注意的是,您似乎将所有值放入displayCellPositionsList.

我对那件事完全错了。

但这东西是对的。我已经执行并且它有效。(假设我理解你想要做什么,它仍然有点模糊)

如果你有一个行列表,一个列列表,最后是一个 2 坐标列表,那么你真的有 3 组嵌套列表。我不确定您到底在做什么或为什么要那样做,但如果那是您真正想要的,那么您CellPositionsList真的需要List<List<List<int>>>。如果你这样做,你可以使用这个代码:

for (int row = 0; row < rows; row++) {
    CellPositionsList.Add(new List<List<int>>());
    for (int col = 0; col < cols; col++) {
        CellPositionsList[row].Add(new List<int> {row, col});
    }
}
于 2013-09-03T22:24:10.127 回答