C# 如何在CSharp中实现多维数组洗牌?
我想知道是否有可能在C语言中实现一个类似Julia\Matlab的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;
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
获取每个维度的大小。这里面没有内置的东西,在这里询问图书馆是错误的。如果你给代码一次尝试