我有以下内容:
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做到这一点吗?以及如何?
尝试以下
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);
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];
}
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;
}
请注意,在这种情况下,如果任何列表包含一个数组,该数组没有足够的值来填充您想要的所有列,则它们将留下默认值,则不会引发异常。如果您希望发生这种情况,您需要检查一下并自己扔一个。
var array = list.Select(item => item.Take(2).ToArray()).ToArray();
foreach (var item in array)
{
Console.WriteLine("{0}, {1}", item[0], item[1]);
}