【问题标题】:How can I delete rows and columns from 2D array in C#?如何从 C# 中的二维数组中删除行和列?
【发布时间】:2014-12-05 20:04:21
【问题描述】:

如何在 C# 中从二维数组中删除特定的行和列?

int[,] array= {{1,2,3},{4,5,6},{7,8,9}};

假设我想删除第 i 行和第 i 列(跳过它们)......对于 nXn 数组不仅仅是 3x3,并将剩余数组存储在一个新数组中...... 所以输出将是:

{5,6},{8,9}

【问题讨论】:

  • 您的预期输出是什么?
  • 您不能从数组中“删除”项目,它们的大小是固定的。
  • 您不能从数组中删除项目。但是您可以创建一个新的,其中将包含原始数组中的所有项目,但要删除的项目除外。
  • 是的,我提到我想将它存储在不同的数组中,而不是同一个数组中

标签: c# multidimensional-array delete-row


【解决方案1】:

我创建了这个方法,看看

 public static double[,] fillNewArr(double[,] originalArr, int row, int col)
    {
        double[,] tempArray = new double[originalArr.GetLength(0) - 1, originalArr.GetLength(1) - 1];
        int newRow = 0;
        int newCol = 0;
        for (int i = 0; i < originalArr.GetLength(0); i++)
        {
            for (int j = 0; j < originalArr.GetLength(1); j++)
            {
                if(i != row && j != col)
                {
                    tempArray[newRow, newCol] = originalArr[i, j];
                    newRow++;
                    newCol++;
                }

            }

        }
        return tempArray;

    }

有些超出范围,原因很明显,但我正试图到达那里......

【讨论】:

  • 你会得到一个 IndexOutOfRangeException。
  • 是的,你是对的。我将数组长度减 1,然后在未定义的索引中添加我想要的元素!
  • @brz 我修改了它,但仍然超出范围。我必须将 newRow++ 放在更好的地方..
  • 用我的答案,我把它做成了一个方法。
【解决方案2】:

没有内置的方法可以做到这一点,你可以自己做:

 static void Main()
        {
            int[,] array = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
            var trim = TrimArray(0, 2, array);
        }


        public static int[,] TrimArray(int rowToRemove, int columnToRemove, int[,] originalArray)
        {
            int[,] result = new int[originalArray.GetLength(0) - 1, originalArray.GetLength(1) - 1];

            for (int i = 0, j = 0; i < originalArray.GetLength(0); i++)
            {
                if (i == rowToRemove)
                    continue;

                for (int k = 0, u = 0; k < originalArray.GetLength(1); k++)
                {
                    if (k == columnToRemove)
                        continue;

                    result[j, u] = originalArray[i, k];
                    u++;
                }
                j++;
            }

            return result;
        }

【讨论】:

  • @WT86 您可以轻松地从中提取方法,请参阅编辑后的答案。
【解决方案3】:

非常简单的逻辑。只是玩循环:

int[,] array = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int[,] arrayskip = new int[array.GetLength(0) - 1, array.GetLength(1) - 1];

for (int i = 1; i < array.GetLength(0); i++)
{
    for (int j = 1; j < array.GetLength(1); j++)
    {
        arrayskip[i - 1, j - 1] = array[i, j];
    }
}

【讨论】:

  • 谢谢,但在你的情况下,如果 i-0,我假设会抛出异常,因为索引是 -1,-1 ?这不起作用。
  • 那么循环将不会继续,因为长度将为 0。
  • 看看你的条件数组[i, j];在第一次迭代时,你将如何获得数组的数组 [0,0] 元素?
【解决方案4】:

不,数组不允许您这样做。您可以为此创建自己的数据结构,但这不会非常简单(例如,如果您只想能够删除行)。

对于简单的操作,在底层数组之上构建一个类并处理重新索引以将虚拟二维数组映射到下面的物理数组就足够了。但是,当您将删除和添加结合起来并整体变形数组时,它会变得有点棘手。

【讨论】:

  • OP 要求跳过一些项目并将其存储在一个新数组中。实际上并未要求删除数组的项。
  • 它不像真正的删除它只是跳过特定元素并将剩余的元素存储在一个新数组中......就是这样
  • @WT86 好吧,在这种情况下,一个简单的 for 循环就可以了。那么你的问题是什么,你的工作在哪里? :D
猜你喜欢
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2012-01-23
  • 2010-12-20
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多