2012-09-29 215 views
1

我從列表中創建了一個矩陣。我如何刪除'i'列和'i'列?有沒有一種方法呢?我試過RemoveAt,但是會刪除一個項目。從列表中刪除行和列c#

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

+1

我建議使用數組而不是列表的列表來製作矩陣。 – podiluska

回答

1

你要做的它在2次。

首先刪除第一維。 (我更喜歡談論的尺寸比列/行可被誤解)

mtx.removeAt(i); 

然後在第一維迭代,以消除第二維的元素。

foreach(List<int> list in mtx){ 
    list.removeAt(i); 
} 
1

要刪除i行:

mtx.RemoveAt(i); 

刪除列j

foreach (var row in mtx) 
{ 
    row.RemoveAt(j); 
} 
2

Cuong Le和Florian F.給出的答案是正確的;但我建議你創建一個矩陣類

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