Удалить строку массива 2D строк в C # - PullRequest
2 голосов
/ 21 марта 2011

Я делаю программу, которая хранит данные в двумерном массиве. Я хотел бы иметь возможность удалять строки из этого массива. Я не могу понять, почему этот код не работает:

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];
     }
}

Может ли кто-нибудь помочь мне? Я хотел бы удалить одну строку и перетасовать все строки под ней на одно место. Thankyou!

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

вам нужно создать новый массив, если вы хотите удалить элемент

попробуйте что-то вроде этого

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];
     }
}
1 голос
/ 25 февраля 2016

Здесь хорошо работает метод вложенных циклов: 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

0 голосов
/ 21 марта 2011

Разве ++ не должен быть я ++? ++ i увеличивает до того, как будет выполнена матричная операция (т.е. предварительное увеличение)

...