如标题所述...
- 我有一个 2d 列表
- 该列表包含 9 个其他包含整数 1 - 9 的列表
List<List<int>> empty_cells;
List<int> row = new List<int> {0,1,2,3,4,5,6,7,8}
for (int i = 0; i <=8 ; i++)
{
empty_cells.Add(row)
}
- 我想从选定的子列表中删除元素
empty_cells[sublist_index].RemoveAt(index_to_remove)
此代码改为从父列表empty_cells
的所有子列表中删除位于index_to_remove
处的项。使所有子列表比以前短一个元素
两个问题
一个。为什么会这样?
二.我怎样才能实现我想做的事情?
将你的进程更改为这个,使用 ToList((
List<List<int>> empty_cells;
List<int> row = new List<int> {0,1,2,3,4,5,6,7,8}
for (int i = 0; i <=8 ; i++)
{
empty_cells.Add(row.ToList());
}
ToList()
方法将值复制到要设置为的变量,而不是将两个变量的引用设置为相同的数据。
首先,你的代码无法编译,因为没有分配empty_cells
,所以我假设它实际上是
List<List<int>> empty_cells = new List<List<int>>();
List<int> row = new List<int> {0,1,2,3,4,5,6,7,8}
for (int i = 0; i <=8 ; i++)
{
empty_cells.Add(row)
}
仅创建一个row
列表。代码运行后,empty_cells
的每个元素都是对同一列表的引用。您可以验证:
foreach (var list in empty_cells)
{
Console.WriteLine(object.ReferenceEquals(list, row);
}
因此,对任何索引执行empty_cells[sublist_index].RemoveAt(index_to_remove);
与从原始row
列表中删除元素相同。一个简单的解决方法是每次添加都使用ToList
:
for (int i = 0; i <=8 ; i++)
{
empty_cells.Add(row.ToList())
}
ToList
创建一个内容与row
相同的新List
对象。
作为旁注,您可以使用Enumerable.Range
更轻松地编写代码:
IEnumerable<int> row = Enumerable.Range(0, 9);
for (int i = 0; i <=8 ; i++)
{
empty_cells.Add(row.ToList());
}