2011-03-21 74 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