【问题标题】:How can I compare items in a jagged array?如何比较锯齿状数组中的项目?
【发布时间】:2012-08-12 15:47:26
【问题描述】:

我想创建一个特定类型的锯齿状数组,然后根据数组中两个项目之间的比较创建另一个数组。

例如:

int[][] arr = new int[][] 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22},
    new int[] {0,2,4,6}
};

int[][] arrResult = new int[arr.GetUpperBound(0)][]; 

for (int i = 0; i < arr.GetUpperBound(0); i++)
{
    for (int j = 0; j < arr[i].Length; j++)
    {
        arrResult[i][j] = arr[i][j] + arr[i + 1][j];
    }
}

如果 i+1 不存在,我不知道该怎么说,然后跳过那个比较。还是有更好的方法来做到这一点?

编辑

通过比较,我的意思是我想访问数组中在列中依次出现的两个项目,对它们执行一些操作并从产品中创建一个新数组(具有相同结构)的条目。

【问题讨论】:

  • based on comparisons between two items 哪些项目?
  • 在示例中,我只是将 arr[i][j] 和 arr[i+1][j] 添加在一起以创建 arrResult[i][j],但我想找到一个该技术可以让我比较数组中更复杂的项目,然后从比较中生成一个新数组。
  • 1) 你没有比较任何东西。 2) 捡两个物品add的规则是什么
  • 对不起,通过比较我的意思是我想从数组中访问两个在列中相继出现的项目,对它们做一些事情并创建一个新数组的条目(具有相同的结构)产品。

标签: c# jagged-arrays


【解决方案1】:

首先,这里不需要GetUpperBound()。这对多维数组(或非基于 0 的数组)很有用,而不是锯齿状数组。相反,您可以使用Length - 1

其次,您需要创建要分配的数组。 new int[count][] 不会创建嵌套数组,因此您的代码会抛出 NullReferenceException

第三,您希望将索引(和创建的数组的大小)限制为两个大小中的较小者。你可以使用Math.Min()

放在一起:

int[][] arrResult = new int[arr.Length - 1][]; 

for (int i = 0; i < arr.Length - 1; i++)
{
    int length = Math.Min(arr[i].Length, arr[i+1].Length);
    arrResult[i] = new int[length];

    for (int j = 0; j < length; j++)
    {
        arrResult[i][j] = arr[i][j] + arr[i + 1][j];
    }
}

第四,作为替代方案,您可以使用 LINQ Zip()(它会通过较短的数组来限制结果的大小):

int[][] arrResult = new int[arr.Length - 1][]; 

for (int i = 0; i < arr.Length - 1; i++)
{
    arrResult[i] = arr[i].Zip(arr[i+1], (a, b) => a + b).ToArray();
}

【讨论】:

    【解决方案2】:

    你不是在比较,而是在添加。所以不清楚你真正想做什么。

    如果要对连续两行的对应项进行操作,只能对两行的最小长度进行操作

    for (int i = 0; i < arr.Length - 1); i++) {
        for (int j = 0; j < arr[i].Length && j < arr[i + 1].Length; j++) {
            arrResult[i][j] = arr[i][j] + arr[i + 1][j];
        } 
    } 
    

    【讨论】:

    • 我按照 svick 的建议将 GetUpperBound() 替换为 Length - 1
    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2015-09-23
    • 2021-11-07
    相关资源
    最近更新 更多