2011-03-21 57 views
1

我正在製作一個程序,將數據存儲在二維數組中。我想能夠從這個數組中刪除行。我不明白爲什麼這個代碼不起作用:在C中刪除2D字符串數組的行#

for (int n = index; n < a.GetUpperBound(1); ++n) 
{ 
    for (int i = 0; i < a.GetUpperBound(0); ++i) 
    { 
     a[i, n] = a[i, n + 1]; 
    } 
} 

有人能幫我嗎?我希望它刪除一行,並將其下的所有行拖動到一個地方。謝謝!

+1

你可以使用'名單'完成。然後這會給你'Remove'和'RemoveAt'方法,並且會爲你處理間隙的管理。 – 2011-03-21 10:25:24

回答

1

你需要創建一個新的數組,如果你想刪除一個項目

嘗試這樣的事情

var arrayUpdated = new string[a.GetUpperBound(1)][a.GetUpperBound(0)-1]; 
for (int n = index; n < a.GetUpperBound(1); n++) 
{ 
    for (int i = 0; i < a.GetUpperBound(0); i++) 
    { 
     arrayUpdated [i, n] = a[i, 1]; 
    } 
} 
+0

是的,這個修改工作。感謝堆! – YoshieMaster 2011-03-21 20:44:03

-1

不應該++我是我的++? ++我遞增之前執行矩陣操作(即預增)

1

嵌套for循環方法在這裏效果很好:https://stackoverflow.com/a/8000574

這裏是一個方法,將上述[,]數組方法的外部循環轉換爲使用linq。只有在遍歷過程中使用linq做其他事情時,才推薦使用linq。

public T[,] RemoveRow<T>(T[,] array2d, int rowToRemove) 
    { 
     var resultAsList = Enumerable 
      .Range(0, array2d.GetLength(0)) // select all the rows available 
      .Where(i => i != rowToRemove) // except for the one we don't want 
      .Select(i =>      // select the results as a string[] 
      { 
       T[] row = new T[array2d.GetLength(1)]; 
       for (int column = 0; column < array2d.GetLength(1); column++) 
       { 
        row[column] = array2d[i, column]; 
       } 
       return row; 
      }).ToList(); 

     // convert List<string[]> to string[,]. 
     return CreateRectangularArray(resultAsList); // CreateRectangularArray() can be copied from https://stackoverflow.com/a/9775057 
    } 

使用Enumerable.Range遍歷所有的行爲https://stackoverflow.com/a/18673845