转换多维数组元素不同类型的 [英] Converting multidimensional array elements to different type

查看:108
本文介绍了转换多维数组元素不同类型的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有这样的多维数组:

 浮法[] [,]顶点= {
            新的浮动[,] {{0F,1.28f},{1.28f,2.56f},{3.84f,2.56f},{5.12f,1.28f},{3.84f,0F},{1.28f,0F} {0F,1.28f}},
            新的浮动[,] {{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 是一个公共类,其中只包含 X 属性:

 公共类Vector2 {
  公众持股量X;
  公众持股量ÿ;  公共Vector2(浮点X,浮法Y){this.x = X; this.y = Y}
}

所以我想构建从Array Vector2元素[2]的元素,这是在上述顶点子数组的数组变量。

我这样做是这样的:

  Array.ConvertAll(顶点[0]
    新的转换器和LT;浮动[],Vector2>(verticesSequence => {返回新Vector2(verticesSequence [0],verticesSequence [1]);}));

然而,作为回报我收到此错误信息:


  

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



解决方案

您有一个数组,其中包含两个数组,每个都包含不同数量的浮动阵列。

Array.ConvertAll 适于通过指定映射委托(一对一)转换一个阵列到另一个。在这种情况下,你不仅要一个浮法[,] 转换成 Vector2 。请注意,您也使用了浮动[] Vector2 转换器,而不是浮动[, ] Vector2

浮法[,] 多维数组也有点棘手,因为他们不支持LINQ开箱即用,它有点难以创造的单班轮这将做所有的映射。

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

 公共静态的IEnumerable< Vector2> ConvertVectors(浮动[,]列表)
{
    对于(INT行= 0;&行LT; list.GetLength(0);排++)
    {
        产量返回新Vector2(名单[排,0],列表[行1]);
    }
}

然后就可以使用了 Array.ConvertAll 方法中:

  VAR转换= Array.ConvertAll<浮动[,],Vector2 []>(
    顶点
    FF => ConvertVectors(FF).ToArray());

老实说,我会preFER一个LINQ解决方案,因为它会自动推断出所有的通用参数:

 变种R =顶点
    。选择(V => ConvertVectors(ⅴ).ToArray())
    .ToArray();

Suppose I have this multidimensional array:

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

Now, I want to convert each subarray to an array of type Vector2[] where Vector2 is a public class, which simply contains x and y properties:

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

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

So I want to construct Vector2 elements from Array[2] elements, which are subarrays in above vertices array variable.

I do it like this:

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

However, in return I receive this error message:

Error 15 The best overloaded method match for 'System.Array.ConvertAll(float[][], System.Converter)' has some invalid arguments

解决方案

You have an array, which contains two arrays, each of which contains a different number of float arrays.

Array.ConvertAll is suitable for converting one array into the other by specifying a mapping delegate (one to one). In this case, you don't only have to convert a single float[,] into a Vector2. Note that you also used a float[] to Vector2 converter, instead of float[,] to Vector2.

Multidimensional arrays like float[,] are also a bit tricky since they don't support LINQ out of the box, which it a bit harder to create a one-liner which would do all the mapping.

In other words, you will at least need a helper method to map the items of the multidimensional array:

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]);
    }
}

And then you can use that inside the Array.ConvertAll method:

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

Honestly, I would prefer a LINQ solution because it will infer all the generic parameters automatically:

var r = vertices
    .Select(v => ConvertVectors(v).ToArray())
    .ToArray();

这篇关于转换多维数组元素不同类型的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆