26

什么是selectMany.ToArray()方法?它是内置方法C#吗?

我需要将二维数组转换为一维数组。

4

4 回答 4

61

如果您的意思是锯齿状数组 ( T[][]),SelectMany是您的朋友。但是,如果您的意思是一个矩形数组 ( ),那么您可以通过- 或T[,]仅枚举日期数据:foreach

int[,] from = new int[,] {{1,2},{3,4},{5,6}};
int[] to = from.Cast<int>().ToArray();
于 2009-03-13T05:21:25.760 回答
29

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();
于 2009-03-13T04:48:49.783 回答
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

于 2020-08-24T14:34:45.087 回答
-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;
    }
}
于 2018-12-03T17:28:49.537 回答