从列表列表中删除行和列c#

时间:2012-09-29 17:51:13

标签: c#

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

3 个答案:

答案 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);
}