簡體   English   中英

如何創建未知多維參數?

[英]How To create unknown-multidimensional parameter?

我想知道是否可以創建一個通用的多維參數。 我正在制作一個通用列表/數組洗牌 class ,它有一個 static 方法,它獲取一個 IEnumerable 參數並返回相同但已經洗牌。 問題是我不知道如何使參數如此通用以至於它可以獲得任意數量的維度數組/列表。

先感謝您。

這是我現在寫的代碼:

 public static IEnumerable<T> OneDimensionalShuffle<T>(IEnumerable<T> array)
    {
        var originalList = array.ToList();
        var shuffledList = new List<T>();

        var rand = new Random();

        for (var i = originalList.Count - 1; i >= 0; i--)
        {
            var randomArrayPosition = rand.Next(i + 1); //i+1 because maxValue is exclusive
            shuffledList.Add(originalList[randomArrayPosition]); //Add random point to the shuffledList
            originalList.RemoveAt(randomArrayPosition); //Remove element which was already added to shuffledList
        }

        array = shuffledList;
        return array;
    }

據我所知,沒有辦法訪問任意等級的通用類型多維數組。

備選方案 1 :使用無類型數組

Array arr = new int[1,1];
var rank = arr.Rank;
var value = arr.GetValue(0,0);

這樣做的缺點是它相當慢,並且會導致一堆拳擊。

備選方案 2 :使用自定義多維類型

 public class MyMultiDimensionalArray<T>{
      public T[] backingDataStorage {get;}
      public int Rank {get;}
      public int[] Length {get;}
      public T GetValue(params int[] indices){
           // Math to convert the indices to a one dimensional value
      }
 }

這樣做的一個優點是您可以使用泛型類型,並允許直接訪問底層數組。 缺點是您需要編寫一堆數學來將任意等級的索引轉換為一維索引。 這種情況的一個變體是具有不同的類型,My2DArray、My3DArray 等,以及一個通用接口。

備選方案 3 :根據需要定義盡可能多的方法

 public static void MyMethod<T>(T[]) { /*...*/}
 public static void MyMethod<T>(T[,]) { /*...*/}
 public static void MyMethod<T>(T[,,]) { /*...*/}
 public static void MyMethod<T>(T[,,,]) { /*...*/}

這很容易做到並允許通用類型,但需要大量重復代碼。

根據我的經驗,1d、2d 和 3d arrays 是最常見的。 我從未見過在野外使用的 4d 數組。 甚至 3d arrays 通常會變得如此之大,以至於將一維存儲為鋸齒狀數組(即 int[][,])會更好,因為它避免了對巨大連續 ZCD69B4957F06CD08 等 I218D7BF3D69 切片的需要。更喜歡使用自定義多維數組類型,因為我發現想要對數據進行線性訪問是很常見的,比如序列化或洗牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM