1

我有以下内容:

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 });

我想从中得到一个包含前 2 列的多维数组:

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

我可以使用 linq 做到这一点吗?如何?

4

4 回答 4

4

尝试以下

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

编辑

起初并没有意识到其意图是从源中获取非锯齿状的二维数组。不幸的是,使用标准 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);
于 2012-11-07T21:05:07.127 回答
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];
}
于 2012-11-07T21:14:30.167 回答
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;
}

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

于 2012-11-07T21:16:09.993 回答
0
var array = list.Select(item => item.Take(2).ToArray()).ToArray();
foreach (var item in array)
{
    Console.WriteLine("{0}, {1}", item[0], item[1]);
}
于 2012-11-07T21:09:17.830 回答