什么是selectMany.ToArray()
方法?它是C#
中的内置方法吗?
我需要将二维数组转换为一维数组。
答案 0 :(得分:47)
如果您指的是锯齿状的数组(T[][]
),SelectMany
就是您的朋友。但是,如果您指的是矩形数组(T[,]
),那么您只需通过foreach
枚举日期数据 - 或者:
int[,] from = new int[,] {{1,2},{3,4},{5,6}};
int[] to = from.Cast<int>().ToArray();
答案 1 :(得分:21)
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();
答案 2 :(得分:0)
此解决方案专门用于转换任何类型的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
答案 3 :(得分:-1)
我的解决方案:
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;
}
}