1

リストのリストからマトリックスを作成しました。列'i'と行'i'を削除するにはどうすればよいですか?そのための方法はありますか?試しましRemoveAtたが、1つのアイテムが削除されます。

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

CuongLeとFlorianF.の答えは正しいです。ただし、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回に分けて行う必要があります。

最初に 1 次元を削除します。(誤解される可能性のある列/行よりもディメンションについて話すほうが好きです)

mtx.removeAt(i);

次に、1 次元を反復処理して、2 次元の要素を削除します。

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