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

时间:2014-09-04 06:26:02

标签: c# arrays multidimensional-array converter

假设我有这个多维数组:

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 }
}

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

我这样做:

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

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

  

错误15最佳重载方法匹配   &#39; System.Array.ConvertAll(浮动[] [],   System.Converter)&#39;有一些无效的   参数

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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]));

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