C# 如何在CSharp中实现多维数组洗牌?

C# 如何在CSharp中实现多维数组洗牌?,c#,.net,arrays,multidimensional-array,C#,.net,Arrays,Multidimensional Array,我想知道是否有可能在C语言中实现一个类似Julia\Matlab的View函数,该函数适用于任何维度的数组(例如[,]和[,,,]),就像它们在C语言中那样。所以我想知道是否有一个库为CSharp多维数组提供类似的功能,或者如何在C#中实现它 解决方案有两个方面: 使用包含对主数组的引用的包装器类 使用数组基类使其多态 包装器 class View<T> { private readonly Array array; private readonly int dim;

我想知道是否有可能在C语言中实现一个类似Julia\Matlab的
View
函数,该函数适用于任何维度的数组(例如
[,]
[,,,]
),就像它们在C语言中那样。所以我想知道是否有一个库为CSharp多维数组提供类似的功能,或者如何在C#中实现它

解决方案有两个方面:

  • 使用包含对主数组的引用的包装器类
  • 使用
    数组
    基类使其多态
  • 包装器

    class View<T>
    {
        private readonly Array array;
        private readonly int dim;
        private readonly int slice;
    
        public View(Array array, int dim, int slice)
        {
            this.array = array;
            this.dim = dim;
            this.slice = slice;
        }
    
        public T this[params int[] indexes]
        {
            get { return (T)array.GetValue(BaseIndexesFor(indexes)); }
            set { array.SetValue(value, BaseIndexesFor(indexes)); }
        }
    
        private int[] BaseIndexesFor(int[] indexes)
        {
            if (indexes.Length != array.Rank - 1) throw new ArgumentException("indexes");
    
            int i_index = 0;
            int[] baseIndexes = new int[array.Rank];
    
            for (int i = 0; i < baseIndexes.Length; i++)
            {
                baseIndexes[i] = (i == dim) ? slice : indexes[i_index++];
            }
    
            return baseIndexes;
        }
    }
    
    类视图
    {
    专用只读数组;
    私有只读int-dim;
    私有只读int片;
    公共视图(数组、整型dim、整型切片)
    {
    this.array=数组;
    this.dim=dim;
    this.slice=切片;
    }
    公共T此[params int[]索引]
    {
    获取{return(T)array.GetValue(baseIndexFor(index));}
    set{array.SetValue(value,baseindexefor(index));}
    }
    专用int[]基索引(int[]索引)
    {
    如果(index.Length!=array.Rank-1)抛出新的ArgumentException(“索引”);
    国际指数=0;
    int[]baseIndexes=新的int[array.Rank];
    for(int i=0;i
    2D示例

    var A = new int[,]
    {
        { 1, 2, 3 },
        { 4, 5, 6 },
        { 7, 8, 9 }
    };
    
    /* View(Array array, int dim, int slice)
     * 
     * For 2 dimensional array:
     * dim=0 -> rows
     * dim=1 -> columns
    */
    // From second dimension slice index 1
    // Or simply, take column with index 1
    var B = new View<int>(A, 1, 1); 
    
    B[2] = 0;
    Console.WriteLine(A[2, 1]); // 0
    
    var A=new int[,]
    {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
    };
    /*视图(数组、整型dim、整型切片)
    * 
    *对于二维阵列:
    *dim=0->行
    *dim=1->列
    */
    //从第二维度切片索引1
    //或者简单地说,取索引为1的列
    var B=新视图(A,1,1);
    B[2]=0;
    Console.WriteLine(A[2,1]);//0
    
    3D示例

    var C = new int[,,]
    {
        { 
            { 1, 2, 3 },
            { 4, 5, 6 },
            { 7, 8, 9 }
        },
        {
            { 11, 12, 13 },
            { 14, 15, 16 },
            { 17, 18, 19 }
        },
        {
            { 21, 22, 23 },
            { 24, 25, 26 },
            { 27, 28, 29 }
        }
    };
    
    /* From first dimension slice index 2
     * { 21, 22, 23 },
     * { 24, 25, 26 },
     * { 27, 28, 29 }
     */
    var D = new View<int>(C, 0, 2);
    
    D[1, 1] = 0;
    Console.WriteLine(C[2, 1, 1]); // 0
    
    /* From third dimension slice index 0
     * { 1, 4, 7 },
     * { 11, 14, 17 },
     * { 21, 24, 27 }
     */
    var E = new View<int>(C, 2, 0);
    
    E[2, 0] = 0;
    Console.WriteLine(C[2, 0, 0]); // 0
    
    var C=newint[,,]
    {
    { 
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
    },
    {
    { 11, 12, 13 },
    { 14, 15, 16 },
    { 17, 18, 19 }
    },
    {
    { 21, 22, 23 },
    { 24, 25, 26 },
    { 27, 28, 29 }
    }
    };
    /*从第一维切片索引2
    * { 21, 22, 23 },
    * { 24, 25, 26 },
    * { 27, 28, 29 }
    */
    var D=新视图(C,0,2);
    D[1,1]=0;
    Console.WriteLine(C[2,1,1]);//0
    /*从第三维切片索引0
    * { 1, 4, 7 },
    * { 11, 14, 17 },
    * { 21, 24, 27 }
    */
    var E=新视图(C,2,0);
    E[2,0]=0;
    Console.WriteLine(C[2,0,0]);//0
    
    解决方案有两个方面:

  • 使用包含对主数组的引用的包装器类
  • 使用
    数组
    基类使其多态
  • 包装器

    class View<T>
    {
        private readonly Array array;
        private readonly int dim;
        private readonly int slice;
    
        public View(Array array, int dim, int slice)
        {
            this.array = array;
            this.dim = dim;
            this.slice = slice;
        }
    
        public T this[params int[] indexes]
        {
            get { return (T)array.GetValue(BaseIndexesFor(indexes)); }
            set { array.SetValue(value, BaseIndexesFor(indexes)); }
        }
    
        private int[] BaseIndexesFor(int[] indexes)
        {
            if (indexes.Length != array.Rank - 1) throw new ArgumentException("indexes");
    
            int i_index = 0;
            int[] baseIndexes = new int[array.Rank];
    
            for (int i = 0; i < baseIndexes.Length; i++)
            {
                baseIndexes[i] = (i == dim) ? slice : indexes[i_index++];
            }
    
            return baseIndexes;
        }
    }
    
    类视图
    {
    专用只读数组;
    私有只读int-dim;
    私有只读int片;
    公共视图(数组、整型dim、整型切片)
    {
    this.array=数组;
    this.dim=dim;
    this.slice=切片;
    }
    公共T此[params int[]索引]
    {
    获取{return(T)array.GetValue(baseIndexFor(index));}
    set{array.SetValue(value,baseindexefor(index));}
    }
    专用int[]基索引(int[]索引)
    {
    如果(index.Length!=array.Rank-1)抛出新的ArgumentException(“索引”);
    国际指数=0;
    int[]baseIndexes=新的int[array.Rank];
    for(int i=0;i
    2D示例

    var A = new int[,]
    {
        { 1, 2, 3 },
        { 4, 5, 6 },
        { 7, 8, 9 }
    };
    
    /* View(Array array, int dim, int slice)
     * 
     * For 2 dimensional array:
     * dim=0 -> rows
     * dim=1 -> columns
    */
    // From second dimension slice index 1
    // Or simply, take column with index 1
    var B = new View<int>(A, 1, 1); 
    
    B[2] = 0;
    Console.WriteLine(A[2, 1]); // 0
    
    var A=new int[,]
    {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
    };
    /*视图(数组、整型dim、整型切片)
    * 
    *对于二维阵列:
    *dim=0->行
    *dim=1->列
    */
    //从第二维度切片索引1
    //或者简单地说,取索引为1的列
    var B=新视图(A,1,1);
    B[2]=0;
    Console.WriteLine(A[2,1]);//0
    
    3D示例

    var C = new int[,,]
    {
        { 
            { 1, 2, 3 },
            { 4, 5, 6 },
            { 7, 8, 9 }
        },
        {
            { 11, 12, 13 },
            { 14, 15, 16 },
            { 17, 18, 19 }
        },
        {
            { 21, 22, 23 },
            { 24, 25, 26 },
            { 27, 28, 29 }
        }
    };
    
    /* From first dimension slice index 2
     * { 21, 22, 23 },
     * { 24, 25, 26 },
     * { 27, 28, 29 }
     */
    var D = new View<int>(C, 0, 2);
    
    D[1, 1] = 0;
    Console.WriteLine(C[2, 1, 1]); // 0
    
    /* From third dimension slice index 0
     * { 1, 4, 7 },
     * { 11, 14, 17 },
     * { 21, 24, 27 }
     */
    var E = new View<int>(C, 2, 0);
    
    E[2, 0] = 0;
    Console.WriteLine(C[2, 0, 0]); // 0
    
    var C=newint[,,]
    {
    { 
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
    },
    {
    { 11, 12, 13 },
    { 14, 15, 16 },
    { 17, 18, 19 }
    },
    {
    { 21, 22, 23 },
    { 24, 25, 26 },
    { 27, 28, 29 }
    }
    };
    /*从第一维切片索引2
    * { 21, 22, 23 },
    * { 24, 25, 26 },
    * { 27, 28, 29 }
    */
    var D=新视图(C,0,2);
    D[1,1]=0;
    Console.WriteLine(C[2,1,1]);//0
    /*从第三维切片索引0
    * { 1, 4, 7 },
    * { 11, 14, 17 },
    * { 21, 24, 27 }
    */
    var E=新视图(C,2,0);
    E[2,0]=0;
    Console.WriteLine(C[2,0,0]);//0
    
    那么,特别是您希望实现什么功能?就像
    查看(A,:,1)
    哪个应该返回第一整列一样?当然,您只需使用
    数组.Rank
    获取维度的数量,使用
    数组.GetLength
    获取每个维度的大小。这里面没有内置的东西,在这里询问图书馆是错误的。如果您尝试代码并遇到问题,那么这将是一个很好的问题。问题要求我们推荐或查找书籍、工具、软件库,教程或其他非现场资源与堆栈溢出无关。请注意,如果您尝试此操作,则您的方法应返回一个包含对原始数组的引用的类,以便对其所做的更改将反映在那里。若要展开@Enigmativity的注释,请执行以下操作。其他社区也有其他类型的活动,如代码评审、用户体验等。对于软件推荐,您可以在以下位置加入SO的软件推荐论坛:那么,您希望实现什么功能?就像
    查看(A,:,1)
    哪个应该返回第一整列一样?当然,您只需使用
    数组.Rank
    获取维度的数量,使用
    数组.GetLength
    获取每个维度的大小。这里面没有内置的东西,在这里询问图书馆是错误的。如果你给代码一次尝试