1. 程式人生 > 實用技巧 >C#陣列維度轉換:一維陣列&二維陣列&三維陣列相互轉換

C#陣列維度轉換:一維陣列&二維陣列&三維陣列相互轉換

最近專案需要用到陣列維度轉換,網上資源較少,寫一個分享與備用

1.一維陣列轉二維陣列

/// <summary>
/// 一維陣列轉2維陣列(矩陣)
/// </summary>
/// <param name="obj"></param>
/// <param name="len">矩陣行數</param>
/// <returns></returns>
public static T[,] OneD_2<T>(T[] obj,int len)
{
    if (obj.Length % len != 0)
        return
null; int width = obj.Length / len; T[,] obj2 = new T[len, width]; for (int i = 0; i < obj.Length; i++) { obj2[i / width, i % width] = obj[i]; } return obj2; }

2.一維陣列轉三維陣列

/// <summary>
/// 一維陣列轉3維陣列
/// </summary>
/// <param name="obj"></param>
/// <param name="len">
一維長</param> /// <param name="wid">二維長</param> /// <returns></returns> public static T[,,] OneD_3<T>(T[] obj,int len,int wid) { if (obj.Length % (len* wid) != 0) return null; int height = obj.Length / (len * wid); T[,,] obj2 = new T[len, wid, height];
for (int i = 0; i < obj.Length; i++) { //核心思想把握每個維度的值多久變一次與設定最大值,變化頻率設定用除法,設定最大值用求餘 //第二及之後的維度最大值為自身維度最大值 -1(意思就是最後需要對自身維度最大值求餘) obj2[i / (wid* height), (i / height) % wid, i % height] = obj[i]; } return obj2; }

3.二維陣列轉一維陣列

/// <summary>
/// 二維陣列轉一維陣列
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static T[] TwoD_1<T>(T[,] obj)
{
    T[] obj2 = new T[obj.Length];
    for (int i = 0; i < obj.Length; i++)
        obj2[i] = obj[i / obj.GetLength(1), i % obj.GetLength(1)];
    return obj2;
}

4.三維陣列轉一維陣列

/// <summary>
/// 三維陣列轉一維陣列
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static T[] ThreeD_1<T>(T[,,] obj)
{
    T[] obj2 = new T[obj.Length];
    int wid = obj.GetLength(1);//GetLength從0開始
    int height = obj.GetLength(2);
    for (int i = 0; i < obj.Length; i++)
        obj2[i] = obj[i / (wid * height), (i / height) % wid, i % height];
    return obj2;
}