使用LINQ将double [] [] []初始化为double [1] [2] [3]

时间:2012-04-10 12:06:41

标签: c# linq

我们可以使用linq将double [] [] []数组初始化为double [1] [2] [3](这不是正确的语法)。

使用for循环的方法是

double[][][] myarr = new double[1][][];
for(int i=0; i<1; i++)
{
    myarr[i] = new double[2][];
    for(int j=0; j<2; j++)
    {
         myarr[i][j] = new double[3];
    }
}

但我想要一个更干净的代码。我尝试了Select但它只填充了第一级。怎么去吧。感谢

&安培;顺便说一下这不是作业!!

1 个答案:

答案 0 :(得分:4)

double[][][] threeDimensionArray = 
  Enumerable.Range(0, 1)
            .Select(h1 => Enumerable.Range(0, 2)
                                    .Select(h2 => new double[3])
                                    .ToArray())
            .ToArray();

但这需要进行内存复制的多个ToArray()调用(请参阅下面的实现),因此对于大量项目而言,它不会有效,因此这种“优雅”的解决方案不是免费的。顺便说一句,我更喜欢for循环解决方案。

Enumerable.ToArray()实施:(信用到ILSpy

// System.Linq.Enumerable
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }

     // sll: see implementation of Buffer.ToArray() below
    return new Buffer<TSource>(source).ToArray();
}

// System.Linq.Buffer<TElement>
internal TElement[] ToArray()
{
    if (this.count == 0)
    {
        return new TElement[0];
    }
    if (this.items.Length == this.count)
    {
        return this.items;
    }
    TElement[] array = new TElement[this.count];
    Array.Copy(this.items, 0, array, 0, this.count);
    return array;
}