我需要将以下集合转换为double [,]:
var ret = new List<double[]>();
Run Code Online (Sandbox Code Playgroud)
列表中的所有数组都具有相同的长度.最简单的方法,ret.ToArray()产生double [] [],这不是我想要的.当然,我可以手动创建一个新数组,并在循环中复制数字,但是有更优雅的方式吗?
编辑:我的库是从另一种语言Mathematica调用的,该语言尚未在.Net中开发.我不认为该语言可以利用锯齿状数组.我必须返回一个多维数组.
可能重复:
C#中多维数组和数组数组之间的区别是什么?
任何人都可以解释我的区别string[][]和string[,]?
我不太明白是什么使C#/ .NET(甚至Java)中的矩阵乘法变得如此之慢.
看一下这个基准测试(来源):试图找到更新的基准测试.
Java vs C#vs C++细分http://img411.imageshack.us/img411/9324/perf.gif
C#的整数和双重性能非常接近用MSVC++编译的C++.双精度为87%,32位整数为99%.非常好,我会说.但接下来看矩阵乘法.差距扩大到C#的速度约为19%.这是一个非常大的差异,我不明白.矩阵乘法只是一堆简单的数学运算.怎么这么慢?它不应该与等量的简单浮点或整数运算一样快吗?
这尤其是游戏和XNA的关注点,其中矩阵和矢量性能对物理引擎等事物至关重要.前一段时间,Mono通过一些漂亮的矢量和矩阵类增加了对SIMD指令的支持.它缩小了差距,使Mono比手写的C++更快,尽管没有C++与SIMD一样快.(来源)
矩阵乘法比较http://img237.imageshack.us/img237/2788/resultse.png
这里发生了什么?
编辑:仔细观察,我误读了第二张图.C#看起来非常接近.第一个基准测试只是做了可怕的错误吗?对不起,我错过了第一个基准测试的版本号.我抓住它作为我总是听到的"C#线性代数很慢"的方便参考.我会试着找另一个.
有什么区别:
int [][] myArray;
Run Code Online (Sandbox Code Playgroud)
和
int [,] myOtherArray;
Run Code Online (Sandbox Code Playgroud) 我只想创建一个二维数组的数组来存储坐标点.
所以我想要一个数组,其中每个索引返回一个二维数组,我将其用作x和y.
这是我尝试过的:
waypoints = new int[4][,] {
{{0},{6, 0}},
{{1},{1, 1}},
{{2},{1, 5}},
{{3},{6, 5}}
};
Run Code Online (Sandbox Code Playgroud)
我意识到这可能看起来很愚蠢,但我已经尝试在谷歌上查找了,而且我没有取得任何好成绩.
它给出了一个错误:
"错误CS0623:数组初始化程序只能在变量或字段初始化程序中使用.请尝试使用新表达式"
我也试过这样做:
waypoints = new int[4][,] {
new int[,] {6, 0},
new int[,] {1, 1},
new int[,] {1, 5},
new int[,] {6, 5}
};
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:
"错误CS0846:预期嵌套数组初始化程序"
我想做的事情如下:
object[] rowOfObjects = GetRow();//filled somewhere else
object[,] tableOfObjects = new object[10,10];
tableOfObjects[0] = rowOfObjects;
Run Code Online (Sandbox Code Playgroud)
这有点可能,语法是什么?
或者我需要这样做:
for (int i = 0; i < rowOfObjects.Length; i++)
{
tableOfObjects[0,i] = rowOfObjects[i];
}
Run Code Online (Sandbox Code Playgroud)
并使用循环填充二维数组行?
谢谢
来自perl背景,我一直使用定义2D数组int[][].我知道你可以使用,int[,]所以有什么区别?
我想使用Reflection.Emit创建一个多维数组并设置它的元素.像下面的C#代码一样:
int[,] nums = new int[2, 2];
nums[1, 1] = 2;
Run Code Online (Sandbox Code Playgroud)
转入IL代码:
IL_0000: nop
IL_0001: ldc.i4.2
IL_0002: ldc.i4.2
IL_0003: newobj instance void int32[0..., 0...]::.ctor(int32, int32)
IL_0008: stloc.0
IL_0009: ldloc.0
IL_000a: ldc.i4.1
IL_000b: ldc.i4.1
IL_000c: ldc.i4.2
IL_000d: call instance void int32[0..., 0...]::Set(int32, int32, int32)
Run Code Online (Sandbox Code Playgroud)
用于创建数组的IL代码:
newobj instance void int32[0..., 0...]::.ctor(int32, int32)
Run Code Online (Sandbox Code Playgroud)
以及用于设置数组元素的IL代码:
call instance void int32[0..., 0...]::Set(int32, int32, int32)
Run Code Online (Sandbox Code Playgroud)
什么样的IL Generator.Emit()代码对应那两个IL句子?
在讨论关于SO的另一个问题时,我被告知语法
int[] numbers = new int[10];
Run Code Online (Sandbox Code Playgroud)
比.更好
Array numbers = Array.CreateInstance(typeof(int), 10);
Run Code Online (Sandbox Code Playgroud)
我的问题是,第一个语法何时有用,何时第二个语法有用?为什么?
有没有一种优雅的方法来在C#中展平2D数组(使用Linq与否)?
比如假设
var my2dArray = new int[][] {
new int[] {1,2,3},
new int[] {4,5,6}
};
Run Code Online (Sandbox Code Playgroud)
我想打电话
my2dArray.flatten()
Run Code Online (Sandbox Code Playgroud)
会产生的
{1,2,3,4,5,6}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?