C# 从列表转换为double[,]
是否存在将列表转换为双[,]的一行无循环?如果要从一个dim数组列表创建一个2 dim数组,则需要循环,尽管它可能与呼叫站点上的情况不同。转换为双[,]只能通过循环列表来完成,并且要求列表中包含的所有数组大小相同:C# 从列表转换为double[,],c#,arrays,C#,Arrays,是否存在将列表转换为双[,]的一行无循环?如果要从一个dim数组列表创建一个2 dim数组,则需要循环,尽管它可能与呼叫站点上的情况不同。转换为双[,]只能通过循环列表来完成,并且要求列表中包含的所有数组大小相同: double[,] arr = new double[list.Count, list[0].Length]; for (int i = 0; i < list.Count; i++) { for (int j = 0; j < list[0].Length; j
double[,] arr = new double[list.Count, list[0].Length];
for (int i = 0; i < list.Count; i++)
{
for (int j = 0; j < list[0].Length; j++)
{
arr[i, j] = list[i][j];
}
}
嗯,如果没有循环,您可能无法实现它,但您可以使用一行程序:
double[,] array = list.To2DArray();
To2DArray是一种扩展方法,实现如下:
public static class ExtensionMethods
{
public static T[,] To2DArray<T>(this IEnumerable<IEnumerable<T>> source)
{
var jaggedArray = source.Select(r => r.ToArray()).ToArray();
int rows = jaggedArray.GetLength(0);
int columns = jaggedArray.Max(r => r.Length);
var array = new T[rows, columns];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < jaggedArray[i].Length; j++)
{
array[i, j] = jaggedArray[i][j];
}
}
return array;
}
}
注意,它只在C4中工作,因为早期版本不支持协方差。此变体应适用于C3,但更具体:
public static T[,] To2DArray<T>(this IEnumerable<T[]> source)
{
var jaggedArray = source.ToArray();
// same code from here
}
此语法应适用于:
返回新列表{new double[]{minX,minY},new double[]{maxX,maxY} 这一切都取决于你希望你的队伍有多长:我怀疑有超过80个字符。@leppie,我当然希望它尽可能短@leppie:想知道80个字符的长度是否是标准长度吗?@abatishchev:过去是,现在,我想人们更喜欢120个字符。@leppie:从来都不知道这么小的尺寸。19个监视器广泛出现。许多开发人员拥有比19、21和25更大的监视器。所以140-240个字符很容易查看,若数组不是必需的,你们也可以添加尾随的零size@abatishchev:是的,说得好。这需要额外的过程才能首先找到列表中的最大长度项,以便确定所需的数组大小。最好先找到列表中最长的数组,然后使用列表[0]@Danny:我认为迭代一次要比修剪所有数组的时间长得多first@Danny:new List.Maxa=>a.lenght您可以使用int rows=source.Count;int columns=source.Maxr=>r.Count;直接创建一个锯齿状数组。是的,但之后我需要锯齿状数组来访问数据。我可以使用ElementAt方法,但对于只能枚举一次的可枚举项,它不起作用
public static T[,] To2DArray<T>(this IEnumerable<T[]> source)
{
var jaggedArray = source.ToArray();
// same code from here
}
public static T[,] ToMultidimensional<T>(this T[][] arr, int maxSize)
{
T[,] md = (T[,])Array.CreateInstance(typeof(double), arr.Length, maxSize);
for (int i = 0; i < arr.Length; i++)
for (int j = 0; j < arr[i].Length; j++)
md[i, j] = arr[i][j];
return md;
}
var arr = new List<double[]>
{
new double[] { 1, 2, 3 },
new double[] { 4, 5 }
}
.ToArray();
var j = arr.ToMultidimensional(arr.Max(a => a.Length));