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

3
假设我有这个多维数组:
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[]的数组,其中Vector2是一个公共类,它只包含xy属性。
public class Vector2 {
  public float x;
  public float y;

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

我想从上述vertices数组变量中的子数组Array[2]元素构建Vector2元素。

我会这样做:

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

然而,我收到了以下错误消息:

错误 15:最佳重载方法匹配“System.Array.ConvertAll(float[][], System.Converter)”具有一些无效参数。


什么是无效参数? - Sayse
我不知道。这就是为什么我要问问题的原因。我想知道我的语法有什么问题。 - GuardianX
啊,抱歉,我以为错误信息里可能会有更多的信息(我会看看能不能解决)。 - Sayse
1
错误很简单,Array.ConvertAll 需要一个交错数组,而你传入了一个多维数组。 - Sayse
2个回答

2

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

Array.ConvertAll适用于通过指定映射委托(一对一)将一个数组转换为另一个数组。在这种情况下,您不仅需要将单个float[,]转换为Vector2,还需要使用float[]Vector2的转换器,而不是float[,]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方法内使用它:

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

说实话,我更喜欢使用LINQ解决方案,因为它会自动推断所有的泛型参数:
var r = vertices
    .Select(v => ConvertVectors(v).ToArray())
    .ToArray();

嗯,我正在对vertices [0]使用Array.ConvertAll,它应该是float[,]数组,因此Converter应该具有<float [],Vector2>的泛型参数,对吧? - GuardianX
1
@GuardianX:实际上应该是float[,], Vector2,但我已经更新了完整代码的答案。 - vgru
@GuardianX:顺便说一下,我更喜欢使用LINQ解决方案来进行映射。或者,如果这些数组中确实有很多元素,您可以通过预分配目标数组并使用普通的“for”循环来获得一些轻微的性能优势(当然会牺牲代码的简洁性)。 - vgru

2

如评论中所述,您遇到的错误是因为您试图传递一个多维数组而不是一个锯齿状数组。

针对您的需求,使用一个简单的循环可能更容易。

List<Vector2> newList = new List<Vector2>();
foreach (float[,] array in vertices)
    for (int i = 0; i < array.GetLength(0); i++ ) 
        newList.Add(new Vector2(array[i,0], array[i,1]));

注意:这会遍历所有顶点,因此对于您的需求可能不需要外部循环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接