我正在使用以下内容将列表中的列表转换为int[][]
int[][] preConvertInts = processedList.Select(array => array.ToArray().ToArray()) as int[][];
我在我的方法中返回int[,]
。将int[][]
转换为int[,]
的最佳方式是什么?
编辑:方法
public static int[,] GetIntArrayInts(string dataString){
string data = dataString;
data = data.Replace(Environment.NewLine, "\n");
List<List<int>> processedList = new List<List<int>>();
string[] rows = data.Split('\n');
foreach (string row in rows){
string[] columns = row.Split(',');
List<int> ints = new List<int>();
foreach (string column in columns){
if (int.TryParse(column, out int tileGid)) ints.Add(tileGid);
}
processedList.Add(ints);
}
int[][] preConvertInts = processedList.Select(array => array.ToArray().ToArray()) as int[][];
int[,] processedIntArray = new int[preConvertInts[0].Length, preConvertInts[1].Length];
for (int i = 0; i < preConvertInts.Length; i++){
int[] intArray = preConvertInts[i];
for (int j = 0; j < intArray.Length; j++){
processedIntArray[i, j] = preConvertInts[i][j];
}
}
return processedIntArray;
}
答案 0 :(得分:4)
将int [] []转换为int [,]?
的最佳方法是什么?
这是post中描述的那个。如果所有子阵列具有相同的Length
,那么您的实际工作也会有效。但要引用你:
不幸的是,我的数组不是矩形的。 - Luna
然后尝试转换它没有多大意义。除非您丢失值或添加值以使所有子数组的维度相等。
但是代码中的问题不是此转换,而是这个:
我正在使用以下内容将列表中的列表转换为
int[][]
int[][] preConvertInts = processedList.Select(array => array.ToArray().ToArray()) as int[][];
这是错误的。 null
您将获得preConvertInts
!如果您检查Select
电话的返回值:
您可以看到它返回IEnumerable<int[]>
而不是int[][]
。使用as int[][];
进行转换不起作用,并且仅掩盖2种类型与编译器不同的事实。你做的是将每个子列表转换为一个数组,然后再将(已转换的数组)转换成一个数组。
您需要以正确的方式进行选择:
int [][] preConvertInts = processedList.Select(x=>x.ToArray()).ToArray();
说明:
1)在第一步中,您收集所有子列表并将每个子列表转换为数组:Select(x=>x.ToArray())
2)现在此调用返回IEnumerable<int[]>
,您需要将其再次转换为数组:
Select(x=>x.ToArray()).ToArray();
^^
||
note the dot behind the closing parentesis of the Select call
答案 1 :(得分:0)
锯齿状阵列
public static T[,] ToMultiArray<T>(this IList<T[]> arrays)
{
var length = arrays[0].Length;
var result = new T[arrays.Count, length];
for (var i = 0; i < arrays.Count; i++)
{
var array = arrays[i];
if (array.Length != length)
{
throw new ArgumentException("Misaligned arrays");
}
for (var j = 0; j < length; j++)
{
result[i, j] = array[j];
}
}
return result;
}
多维数组
public static T[][] ToJaggedArray<T>(this IList<T[]> arrays)
{
var result = new T[arrays.Count][];
for (var i = 0; i < arrays.Count; i++)
{
var array = arrays[i];
var length = array.Length;
result[i] = new T[length];
for (var j = 0; j < length; j++)
{
result[i][j] = array[j];
}
}
return result;
}
<强>用法强>
var preConvertInts = list.ToJaggedArray();
或
var preConvertInts = list.ToMultiArray();
this IList<T[]> arrays
此方法适用于包含数组的列表, 为了适应OP的例子,它应该是(this IList<List<T>> arrays
) - Mong 诸
锯齿状阵列
public static T[][] ToJaggedArray<T>(IList<List<T>> arrays)
{
var result = new T[arrays.Count][];
for (var i = 0; i < arrays.Count; i++)
{
var array = arrays[i];
var length = array.Count;
result[i] = new T[length];
for (var j = 0; j < length; j++)
{
result[i][j] = array[j];
}
}
return result;
}
多维数组
public static T[,] ToMultiArray<T>(IList<List<T>> arrays)
{
var length = arrays[0].Count;
var result = new T[arrays.Count, length];
for (var i = 0; i < arrays.Count; i++)
{
var array = arrays[i];
if (array.Count != length)
{
throw new ArgumentException("Misaligned arrays");
}
for (var j = 0; j < length; j++)
{
result[i, j] = array[j];
}
}
return result;
}
注意 :完全未经测试