我有以下内容:
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吗?怎么样?
答案 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]);
}