粗糙和锯齿状阵列有什么区别?根据我的研究,两者都有相同的定义,即具有不同列长度的二维阵列.
在C#中,有两种方法可以创建多维数组.
int[,] array1 = new int[32,32];
int[][] array2 = new int[32][];
for(int i=0;i<32;i++) array2[i] = new int[32];
Run Code Online (Sandbox Code Playgroud)
我知道第一种方法在内部创建一维数组,第二种方法创建一个数组数组(访问速度较慢).
但是在Java中,没有[,]这样的东西,我看到多维数组声明如下:
int[][] array3 = new int[32][32];
Run Code Online (Sandbox Code Playgroud)
由于这种语法在C#中是非法的,而Java没有int[,],我想知道这是否等效array1?或者它仍然是一个数组数组?
你怎么能创建一个2D数组,比如arr[][]5行,每行中的列数可变?
可能arr[5][]
是第一行arr[0][]有4列
第2行arr[1][]有5列,依此类推?
我不介意STL矢量解决方案,但我还不太了解矢量.
是否可以在JavaScript中使用锯齿状数组?
这是我想要存储在锯齿状数组中的数据格式:
(key)(value1, value2, value3)
Run Code Online (Sandbox Code Playgroud)
我可以把它放在一个锯齿状的阵列中吗?
考虑以下数组:
int[,] numbers = new int[3, 2] { { 2, 1 }, { 3, 4 }, { 6, 5 } };
我想使用LINQ来构造一个数字为2,1,3,4,6,5的IEnumerable.
最好的方法是什么?
当然,C#支持一维和多维数组,并且支持数组的数组。众所周知,如果在数组数组中,内部数组类型与外部数组具有不同的等级(维数),则 C# 语言和 .NET 运行时在类型中给出括号的顺序上存在分歧姓名。尤其:
typeof(string[][,]).Name == "String[,][]"
Run Code Online (Sandbox Code Playgroud)
和:
typeof(string[,][]).Name == "String[][,]"
Run Code Online (Sandbox Code Playgroud)
所以可能会出现一些混乱,但它确实有效。
以下是此类类型的正确用法:
static void Foo1(string[,][] a) {
//read:
string[] entry = a[7, 8];
//write:
a[7, 8] = new string[] { "alfa", "bravo", "charlie", "delta", };
}
static void Bar1(string[][,] a) {
//read:
string[,] entry = a[9];
//write:
a[9] = new string[,] { { "echo", "foxtrot", }, { "golf", "hotel", }, { "india", "juliett", }, };
}
Run Code Online (Sandbox Code Playgroud)
读者可以自己验证它是否可以编译并且可以工作(当然必须传入足够大的数组)。
现在,当我们尝试将上述内容与可空引用类型结合起来时,就会出现严重的问题,正如 C# 8(从 2019 年起)以来的 C# 中所存在的那样。至少使用我这里的编译器实现(最新版本的 Visual Studio 2022)。也就是说,如果我做这个轻微的修改:
// …Run Code Online (Sandbox Code Playgroud) c# jagged-arrays compiler-bug arrayofarrays nullable-reference-types
我有一个二维锯齿状数组(虽然它总是矩形),我使用传统的循环初始化:
var myArr = new double[rowCount][];
for (int i = 0; i < rowCount; i++) {
myArr[i] = new double[colCount];
}
Run Code Online (Sandbox Code Playgroud)
我想也许一些LINQ函数会在一个语句中给我一个优雅的方法来做到这一点.但是,我能想出的最接近的是:
double[][] myArr = Enumerable.Repeat(new double[colCount], rowCount).ToArray();
Run Code Online (Sandbox Code Playgroud)
问题是它似乎正在创建一个单独的double[colCount]并为每行分配一个新数组的intsead分配引用.有没有办法做到这一点,而不是太神秘?
我们的作业分配要求我们使用锯齿状数组来存储二维布尔矩阵的值.是否有针对锯齿状数组的内置java类,或者我将不得不使用ArrayLists数组手动创建它?
使用 C# 8 的可空引用类型,我们可以编写(对于引用类型):
T x = ...;
T? y = x;
Run Code Online (Sandbox Code Playgroud)
但是,我无法理解多维和锯齿状数组的转换规则。
string[][] a = new string[1][];
string?[]?[] b = new string[1][];
string?[]?[]? c = new string[1][];
string?[,][] d = new string[1,2][];
string?[,][]? e = new string[1,2][];
string?[,]?[] f = new string[1,2][]; // compiler error
Run Code Online (Sandbox Code Playgroud)
最后一个例子给了我
错误 CS0029:无法将类型 'string[ , ][]' 隐式转换为 'string?[ , ]?[]'
既然它适用于锯齿状数组(请参阅 参考资料b),为什么它不适用于多维数组呢?
R# 还告诉我
'c' 可以声明为不可空
string?[]?[]? c = new string[1][];
// ^ redundant
Run Code Online (Sandbox Code Playgroud)
我知道编译器可以证明它c本身不为空,但我很困惑第三个?是多余的。鉴于锯齿状数组是从左到右创建的(即new int[2][]而不是 …
c# jagged-arrays multidimensional-array nullable-reference-types
因此,事实证明并非创建的所有阵列等.多维数组可以具有非零下限.请参阅Excel PIA的Range.Value属性object[,] rectData = myRange.Value;
我需要将这些数据转换为锯齿状数组.我第一次尝试下面的复杂气味.有什么优化建议吗?它需要处理下限可能不为零的一般情况.
我有这个ex方法:
public static T[][] AsJagged<T>( this T[,] rect )
{
int row1 = rect.GetLowerBound(0);
int rowN = rect.GetUpperBound(0);
int col1 = rect.GetLowerBound(1);
int colN = rect.GetUpperBound(1);
int height = rowN - row1 + 1;
int width = colN - col1 + 1;
T[][] jagged = new T[height][];
int k = 0;
int l;
for ( int i = row1; i < row1 + height; i++ )
{
l = 0;
T[] …Run Code Online (Sandbox Code Playgroud) jagged-arrays ×10
c# ×6
arrays ×5
java ×3
linq ×2
.net ×1
c++ ×1
compiler-bug ×1
javascript ×1
vector ×1