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

編集

最初は、ギザギザのない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);
于 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 に答える