1

我从列表列表中制作了一个矩阵。如何删除列“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 行

4

3 回答 3

3

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 类,你甚至可以重载数学运算符来处理矩阵。请参阅有关重载运算符的教程。

于 2012-09-29T18:16:28.213 回答
1

要删除行i

mtx.RemoveAt(i);

删除列j

foreach (var row in mtx)
{
    row.RemoveAt(j);
}
于 2012-09-29T17:57:14.137 回答
1

你必须做 2 次。

首先删除第一个维度。(我更喜欢谈论维度而不是可能被误解的列/行)

mtx.removeAt(i);

然后迭代第一个维度以删除第二个维度上的元素。

foreach(List<int> list in mtx){
    list.removeAt(i);
}
于 2012-09-29T18:00:06.273 回答