【问题标题】:How to join indexes in an 2D array in C#如何在 C# 中连接二维数组中的索引
【发布时间】:2021-12-27 18:18:47
【问题描述】:

有没有一种有效的方法来连接数组中的块,如下所示:

original_array = [[1,2], [4,7], [8,10], [15,20], [21,25]]

new_array = [[1,2], [4,10], [15,25]]

如果它们之间的距离为 1,基本上我想加入数组的 2 个索引。

我尝试了类似的方法,但没有成功。

                int[,] new_array = new int[500, 2];
                int new_var = 0;
                for (int k = 0; k < original_indexes; k++)
                {
                    int dista = original_array [k + 1, 0] - original_array [k, 1];
                    if (dista < 10)
                    {
                        new_array[k, 0] = original_array[k, 0];
                        new_array[k, 1] = original_array[k + 1, 1];
                        new_var++;
                    }
                    else
                    {
                        new_array[k, 0] = original_array[k + new_var, 0];
                        new_array[k, 1] = original_array[k + new_var, 1];
                    }
                }

对不起,我不知道如何更具体,我什至不知道如何搜索。

【问题讨论】:

  • 这让我想起了 run-length encoding,您可以在其中指定 startend(或 连续跨度的数字的开始count)。那是你想要做的吗? 4 thgouth 7 和 8 到 10 是否有效地连续,因为 8 紧跟在 7 之后,因此可以用 4 到 10 的单个跨度来表示?这就是你想要做的吗?
  • 是的,有点。我实际上想要一种可以更改此值的方式。这意味着如果我有 4 到 7 和 9 到 10,我可以加入他们,它变成 4 到 10。
  • 有趣。为什么 4-7 会和 9-10 一起加入?我问是因为这些不是连续的数字范围。即:8 呢?

标签: c# arrays multidimensional-array


【解决方案1】:

你可以试试这样的:

    using System.Linq;

    ...
 
    private static int[,] MyCombine(int[,] source) {
      List<int[]> list = new List<int[]>();

      int[] last = null;

      for (int r = 0; r < source.GetLength(0); ++r) 
        if (last == null || last[1] + 1 < source[r, 0]) {
          if (last != null)
            list.Add(last);

          last = new int[] { source[r, 0], source[r, 1] };
        }
        else
          last[1] = source[r, 1];
      
      if (last != null)
        list.Add(last);

      int[,] result = new int[list.Count, 2];

      for (int r = 0; r < list.Count; ++r)
        for (int c = 0; c < list[r].Length; ++c)
          result[r, c] = list[r][c];

      return result;
    }

演示:

  int[,] original = new int[,] {
    { 1,  2 },
    { 4,  7 },
    { 8, 10 },
    {15, 20 },
    {21, 25 },
  };

  int[,] result = MyCombine(original);

  string report = "[" + string.Join(", ", Enumerable
    .Range(0, result.GetLength(0))
    .Select(r => $"[{result[r, 0]}, {result[r, 1]}]")) + "]";

  Console.Write(report);

结果:

 [[1, 2], [4, 10], [15, 25]]

【讨论】:

  • 这正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多