LINQ和Array.Copy

时间:2012-11-07 21:04:05

标签: c# arrays linq multidimensional-array

我有以下内容:

var list = new List<double[]>();
list.Add(new double[] { 300, 12, 22 });
list.Add(new double[] { 310, 13, 23 });
list.Add(new double[] { 320, 14, 24 });
list.Add(new double[] { 330, 15, 25 });

我想从这个包含前两列的多维数组中获取:

double[,] a = { {300,12}, {310,13}, {320,14}, {330,15}}

我可以使用linq吗?怎么样?

4 个答案:

答案 0 :(得分:2)

尝试以下

var a = list.Select(x => new [] { x[0], x[1] }).ToArray();

修改

一开始没意识到意图是从源头获取非锯齿状的2d阵列。不幸的是,使用标准LINQ方法并没有真正的方法。他们主要处理IEnumerable<T>T[]。但是,没有什么可以阻止你创建一个新的方法来完成这个

    public static T[,] ToMultidimensionArray<T>(this List<T[]> list, int columns)
    {
        var array = new T[list.Count, columns];
        for (int i = 0; i < list.Count; i++)
        {
            var source = list[i];
            for (int j = 0; j < columns; j++)
            {
                array[i, j] = source[j];
            }
        }

        return array;
    }

现在您可以使用简单查询转换原始列表

var a = list.ToMultidimensionArray(2);

答案 1 :(得分:1)

LINQ和多维数组混合不好。 Array.Copy也不适用于此。

使用传统的for循环:

double[,] result = new double[list.Count, 2];

for (int i = 0; i < list.Count; i++)
{
    result[i, 0] = list[i][0];
    result[i, 1] = list[i][1];
}

答案 2 :(得分:1)

public static T[,] GetColumns<T>(IList<IEnumerable<T>> source, int numColumns)
{
    T[,] output = new T[source.Count, numColumns];

    for (int i = 0; i < source.Count; i++)
    {
        int j = 0;
        foreach (T item in source[j].Take(numColumns))
        {
            output[i, j] = item;
            j++;
        }
    }

    return output;
}

请注意,在这种情况下,如果任何列表包含的数组没有足够的值来填充您想要的所有列,那么它们将保留默认值,它不会引发异常。如果你想要这样做,你需要检查并自己扔一个。

答案 3 :(得分:0)

var array = list.Select(item => item.Take(2).ToArray()).ToArray();
foreach (var item in array)
{
    Console.WriteLine("{0}, {1}", item[0], item[1]);
}