我从列表列表中制作了一个矩阵。如何删除列“i”和行“i”?有没有办法呢?我已经尝试过RemoveAt
,但这会删除一项。
List<List<int>> mtx = new List<List<int>>();
0 1 2 3
-------
0|0 0 0 0
1|0 0 0 0
2|0 0 0 0
3|0 0 0 0
例如我想删除第 i=2 行
我从列表列表中制作了一个矩阵。如何删除列“i”和行“i”?有没有办法呢?我已经尝试过RemoveAt
,但这会删除一项。
List<List<int>> mtx = new List<List<int>>();
0 1 2 3
-------
0|0 0 0 0
1|0 0 0 0
2|0 0 0 0
3|0 0 0 0
例如我想删除第 i=2 行
Cuong Le 和 Florian F. 给出的答案是正确的;但是我建议你创建一个 Matrix 类
public class Matrix : List<List<int>>
{
public void RemoveRow(int i)
{
RemoveAt(i);
}
public void RemoveColumn(int i)
{
foreach (List<int> row in this) {
row.RemoveAt(i);
}
}
public void Remove(int i, int j)
{
RemoveRow(i);
RemoveColumn(j);
}
// You can add other things like an indexer with two indexes
public int this[int i, int j]
{
get { return this[i][j]; }
set { this[i][j] = value; }
}
}
这使得使用矩阵变得更容易。更好的方法是隐藏实现(即,它在您在内部使用列表的矩阵类之外不可见)。
public class Matrix
{
private List<List<int>> _internalMatrix;
public Matrix(int m, int n)
{
_internalMatrix = new List<List<int>(m);
for (int i = 0; i < m; i++) {
_internalMatrix[i] = new List<int>(n);
for (int j = 0; j < n; j++) {
_internalMatrix[i].Add(0);
}
}
}
...
}
这使您以后更容易完全更改实现,例如,您可以用数组替换列表,而不会损害矩阵的“用户”。
如果你有一个 Matrix 类,你甚至可以重载数学运算符来处理矩阵。请参阅有关重载运算符的教程。
要删除行i
:
mtx.RemoveAt(i);
删除列j
:
foreach (var row in mtx)
{
row.RemoveAt(j);
}
你必须做 2 次。
首先删除第一个维度。(我更喜欢谈论维度而不是可能被误解的列/行)
mtx.removeAt(i);
然后迭代第一个维度以删除第二个维度上的元素。
foreach(List<int> list in mtx){
list.removeAt(i);
}