转换多维数组元素不同类型的 [英] Converting multidimensional array elements to different type
问题描述
假设我有这样的多维数组:
浮法[] [,]顶点= {
新的浮动[,] {{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[]
whereVector2
is a public class, which simply containsx
andy
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 singlefloat[,]
into aVector2
. Note that you also used afloat[]
toVector2
converter, instead offloat[,]
toVector2
.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屋!