【问题标题】:How to cast from Obj[ , ] to Obj[ ] [duplicate]如何从 Obj[ , ] 转换为 Obj[ ] [重复]
【发布时间】:2021-05-11 12:53:26
【问题描述】:

在我的 C# 项目中,我需要从 Tile[ , ] 生成 Tile[ ] 以迭代一行。

Tile[,] tiles = playfield.Tiles;
Tile[] center_row = Tile[row / 2]; // does not work

我需要从Tile[ , ] 变成Tile[ ][ ] 还是直接转换的方式?

更新

我的问题在https://stackoverflow.com/a/32903582/12416559 的帮助下得到了解决 回答

【问题讨论】:

  • 欢迎来到 StackOverflow。您能否与我们分享一下您如何在tiles 中存储数据(如[column, row][row, column])?
  • 如果您想避免将元素复制到新数组中,那么使用Tile[ ][ ] 是唯一的方法。

标签: c# arrays casting


【解决方案1】:

您可以使用BlockCopy 将所有数据从一个表单移动到另一个表单。

理论上

这是一个作为扩展方法的解决方案

    public static T[] MatrixToVector<T>(this T[,] matrix)
    {
        var size = Buffer.ByteLength(matrix);
        var vector = new T[matrix.Length];
        Buffer.BlockCopy(matrix, 0, vector, 0, size);
        return vector;
    }
    public static T[,] VectorToMatrix<T>(this T[] vector, int rows, int columns)
    {
        var size = Buffer.ByteLength(vector);
        var matrix = new T[rows,columns];
        Buffer.BlockCopy(vector, 0, matrix, 0, size);
        return matrix;
    }

实践中

数组只能是原始类型

进行救援

StackOverflow 救援with a solution

    public static T[] MatrixToVector<T>(this T[,] matrix)
    {
        var vector = matrix.Cast<T>().ToArray();
        return vector;
    }

【讨论】:

    【解决方案2】:

    你进入 UnityEngine,我明白了吗? :)

    好的,您可以使用 Buffer.BlockCopy 方法,如 here 解释的那样

    【讨论】:

    • 如果另一个问题的答案回答了这个问题,请将这个问题标记为另一个问题的重复,而不是用链接回答而不是解释。
    【解决方案3】:

    如果迭代是您想要的,那么您可以从中获取IEnumerator 并简单地迭代:

    int[,] res = new int[2, 2]
        {
            {1,2 },
            {33,45 }
        };
    
    var enumerator = res.GetEnumerator();
    
    while (enumerator.MoveNext())
    {
        Console.WriteLine(enumerator.Current);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多