我从列表列表中创建了一个矩阵。如何删除列'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行
答案 0 :(得分: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类,您甚至可以重载数学运算符以使用矩阵。请参阅overloading operators上的本教程。
答案 1 :(得分:1)
要删除行i
:
mtx.RemoveAt(i);
删除列j
:
foreach (var row in mtx)
{
row.RemoveAt(j);
}
答案 2 :(得分:1)
你必须做2次。
首先删除第一维。 (我更喜欢谈论尺寸而不是可能被误解的列/行)
mtx.removeAt(i);
然后迭代第一维以移除第二维上的元素。
foreach(List<int> list in mtx){
list.removeAt(i);
}