2014-09-04 73 views
2

假設我有這樣的多維數組:轉換多維數組的元素,以不同類型的

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

所以我想從陣列構造Vector2元素[2]的元素,這是在上述vertices數組變量的子陣列。

餘像這樣做:

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

然而,在返回我收到此錯誤消息:

錯誤15最好重載方法匹配 「System.Array.ConvertAll(浮[] [], System.Converter)」有一些無效 參數

+0

什麼是invalild參數? – Sayse 2014-09-04 06:27:28

+0

我不知道。這就是爲什麼我問我的問題。我不知道我的語法有什麼問題。 – GuardianX 2014-09-04 06:34:04

+0

對不起,我以爲可能有更多的信息在錯誤信息(我會看看如果我可以解決它) – Sayse 2014-09-04 06:34:40

回答

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(); 
+0

那麼,我使用頂點[0]上的Array.ConvertAll,它假設爲float [,]數組,因此Converter應該有泛型參數,對不對? – GuardianX 2014-09-04 06:57:19

+1

@GuardianX:它實際上應該是'float [,],Vector2',但我用完整的代碼更新了答案。 – Groo 2014-09-04 06:59:05

+0

@GuardianX:順便說一句,我寧願使用LINQ解決方案來做映射。或者,如果這些數組中有很多元素,那麼可以通過預先分配目標數組並使用普通的for循環(以代碼簡化爲代價)來獲得一些輕微的性能優勢。 – Groo 2014-09-04 07:02:29

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

注:此遍歷所有的頂點,所以外環可能不需要爲您的需求。