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

假设我有这个多维数组:

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是一个公共类, 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(verticesSequence => { return new Vector2(verticesSequence[0], verticesSequence[1]); })); 

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

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

你有一个数组,它包含两个数组,每个数组包含不同数量的浮点数组。

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

float[,]这样的多维数组也有点棘手,因为它们不支持开箱即用的LINQ,创建一个可以完成所有映射的单行程更难。

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

 public static IEnumerable 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( vertices, ff => ConvertVectors(ff).ToArray()); 

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

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

正如评论中所提到的,你得到的错误是因为你试图传入一个多维数组而不是一个锯齿状数组。

根据您的需要,使用简单的循环可能更容易

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

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