转换二维数组
Posted
技术标签:
【中文标题】转换二维数组【英文标题】:Convert 2 dimensional array 【发布时间】:2010-10-13 02:14:13 【问题描述】:selectMany.ToArray()
方法是什么?它是C#
中的内置方法吗?
我需要将二维数组转换为一维数组。
【问题讨论】:
【参考方案1】:如果您的意思是 锯齿状 数组 (T[][]
),SelectMany
是您的朋友。但是,如果您的意思是 rectangular 数组 (T[,]
),那么您可以通过 foreach
枚举日期数据 - 或:
int[,] from = new int[,] 1,2,3,4,5,6;
int[] to = from.Cast<int>().ToArray();
【讨论】:
这个线程 ***.com/questions/5132397/… 详细介绍了执行 foreach 方法以及一些性能指标。 我不知道int[,]
被Cast()
转换为IEnumerable<int>
。很酷的把戏!
请记住,如果from
是只读的,则此方法将失败。
@Chmielok 你是什么意思的例子吗?如果from
是只读字段,它应该可以正常工作;而 AFAIK ImmutableArray<T>
仅支持向量;所以:你描述的是什么场景失败了?【参考方案2】:
SelectMany 是一个投影算子,由命名空间 System.Linq 提供的扩展方法。
它在序列上执行一对多元素投影,允许您将结果序列“扁平化”为一个。
你可以这样使用:
int[][] twoDimensional = new int[][]
new int[] 1, 2,
new int[] 3, 4,
new int[] 5, 6
;
int [] flattened = twoDimensional.SelectMany(x=>x).ToArray();
【讨论】:
学究点;这不是我所说的二维数组——它是一个锯齿状数组…… @MarcGravell 不是二维锯齿状数组吗?显然,锯齿状阵列不是矩形阵列或“立方体”阵列。但它仍然具有一定的维度。要说二维数组没有指定锯齿状或几何/直线。 @barlop 也许,但最终这里的“数组”指的是外部数组,它是一个引用向量;锯齿确实清楚地表明它更复杂,我同意在某些方面可以使用“2D”,而不是int[][][]
。最终,命名很难:)
@MarcGravell 不知道你为什么提到int[][][]
。我并不是真的在谈论他可以实现某些东西的不同方式。我要说的是数组的数组是二维数组,即使数组的数组是锯齿状的。当我提到立方体时,它有点不必要,但我的意思是 3D 锯齿状数组不是立方体,但它仍然是 3 维。正如 2D 锯齿状阵列不是矩形阵列一样,但它仍然具有 2 个维度。称它为 2D 并不排除它是锯齿状的。我也在谈论我们如何像你一样引用那个外部数组。
@MarcGravell 是的,我不否认这一点。记忆是线性的,一维的,也许可以说是二维的。但绝对不是3D。多维数组的概念是一种抽象。我不知道如何存储 [,]
或 [,,,]` 数组,但即使它不存储为数组数组,关于多维数组作为抽象的点对于那些矩形或 '多维数据集的数组。您正在使用基于抽象概念的术语,例如锯齿状数组,并且您提到 2D 数组表明您接受该抽象术语。所以我不知道你为什么提到你是什么【参考方案3】:
此解决方案专门用于转换任何类型的int
数组、常规、锯齿状、或嵌套(这些最后取自 javascript 及其对象表示法,但它们也可以在 C# 中实现为复杂的交错对象数组),转换为简单的一维整数数组:
public static int[] getFlattenedIntArray(object jaggedArray)
var flattenedArray = new List<int>();
var jaggedArrayType = jaggedArray.GetType();
var expectedType = typeof(int);
if (jaggedArrayType.IsArray)
if (expectedType.IsAssignableFrom(jaggedArrayType.GetElementType()))
foreach (var el in jaggedArray as int[])
flattenedArray.Add(el);
else
foreach (var el in jaggedArray as object[])
foreach (var retIntEl in getFlattenedIntArray(el))
flattenedArray.Add(retIntEl);
else if (jaggedArrayType == expectedType)
flattenedArray.Add((int)jaggedArray);
else
return new int[0];
return flattenedArray.ToArray();
用这个小提琴试试看:https://dotnetfiddle.net/5HGX96
【讨论】:
【参考方案4】:我的解决方案:
public struct Array3D<T>
public T[] flatten;
int x_len;
int y_len;
int z_len;
public Array3D(int z_len, int y_len, int x_len)
this.x_len = x_len;
this.y_len = y_len;
this.z_len = z_len;
flatten = new T[z_len * y_len * x_len];
public int getOffset(int z, int y, int x) => y_len * x_len * z + x_len * y + x;
public T this[int z, int y, int x]
get => flatten[y_len * x_len * z + x_len * y + x];
set => flatten[y_len * x_len * z + x_len * y + x] = value;
public T this[int flat_index]
get => flatten[flat_index];
set => flatten[flat_index] = value;
【讨论】:
这与问题有什么关系:convert two dimensional array to one dimensional array
?
在 1d 数组类上使用 2d 数组,然后您可以轻松“转换”为 1d 数组而不会降低性能
改成二维很容易以上是关于转换二维数组的主要内容,如果未能解决你的问题,请参考以下文章
PHP二维数组转换成一维数组,一个变量多个二维数组转换成一维数组,PHP二维数组(或任意维数组)转换成一维数组的方法汇总,array_reduce(); array_walk_recursive()