如何创建未知多维参数



我想知道是否可以创建一个通用的多维参数。我正在制作一个通用的列表/数组shuffle类,该类将有一个静态方法,该方法获取一个IEnumerable参数并返回相同但已经被shuffle的参数。问题是,我不知道如何使参数如此通用,以至于它可以获得任意数量的维度数组/列表。

提前谢谢。

这是我现在写的代码:

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

这样做的一个优点是可以使用泛型类型,并允许直接访问底层数组。缺点是,您需要编写一系列数学运算,将任意级别的索引转换为1d索引。它的一个变体是具有不同的类型,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阵列是最常见的。我从未见过野外使用4d阵列。即使是3d数组也经常会变得很大,因此最好将一维存储为锯齿状数组,即int[][,],因为它避免了对巨大连续内存块的需要,允许锁定单个切片等。我更喜欢使用自定义的多维数组类型,因为我发现在序列化或混洗等情况下,想要对数据进行线性访问是很常见的。

相关内容

  • 没有找到相关文章

最新更新