C#<T> List RemoveAt(int32) 函数删除二维列表中每个列表的所有索引,而不是仅删除指定的列表



如标题所述...

  • 我有一个 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());
}

相关内容

  • 没有找到相关文章

最新更新