将多维数组元素转换为不同类型

2023-12-01

假设我有这个多维数组:

float[][,] vertices = { 
            new float[,]{ {0f, 1.28f}, {1.28f, 2.56f}, {3.84f, 2.56f}, {5.12f, 1.28f}, {3.84f, 0f}, {1.28f, 0f}, {0f, 1.28f} }, 
            new float[,]{ {0f, 3.83f}, {1.27f, 5.12f}, {3.87f, 5.12f}, {5.12f, 3.83f}, {5.12f, 1.26f}, {3.87f, 0f}, {1.27f, 0f}, {0f, 1.26f}, {0f, 3.83f} } 
        };

现在,我想将每个子数组转换为类型的数组Vector2[] where Vector2是一个公共类,它只包含x and y特性:

public class Vector2 {
  public float x;
  public float y;

  public Vector2(float x, float y) { this.x = x; this.y = y }
}

所以我想从 Array[2] 元素构造 Vector2 元素,这些元素是上面的子数组vertices数组变量。

我这样做:

Array.ConvertAll(vertices[0], 
    new Converter<float[], Vector2>(verticesSequence => { return new Vector2(verticesSequence[0], verticesSequence[1]); }));

但是,作为回报,我收到此错误消息:

错误 15 最佳重载方法匹配 'System.Array.ConvertAll(浮点[][], System.Converter)' 有一些无效 论点


您有一个数组,其中包含两个数组,每个数组包含不同数量的浮点数组。

Array.ConvertAll适合通过指定映射委托(一对一)将一个数组转换为另一个数组。在这种情况下,您不仅需要转换单个float[,]变成一个Vector2。请注意,您还使用了float[] to Vector2转换器,而不是float[,] to Vector2.

多维数组如float[,]也有点棘手,因为它们不支持开箱即用的 LINQ,这使得创建一个能够完成所有映射的单行代码有点困难。

换句话说,您至少需要一个辅助方法来映射多维数组的项目:

public static IEnumerable<Vector2> ConvertVectors(float[,] list)
{
    for (int row = 0; row < list.GetLength(0); row++)
    {
        yield return new Vector2(list[row, 0], list[row, 1]);
    }
}

然后你可以在里面使用它Array.ConvertAll method:

var converted = Array.ConvertAll<float[,], Vector2[]>(
    vertices,
    ff => ConvertVectors(ff).ToArray());

老实说,我更喜欢 LINQ 解决方案,因为它会自动推断所有通用参数:

var r = vertices
    .Select(v => ConvertVectors(v).ToArray())
    .ToArray();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多维数组元素转换为不同类型 的相关文章

随机推荐