我有一个多维数组,我需要转换为数组列表。不是单个数组,但是对于第一个维度的每次迭代,我需要一个包含第二维中的值的单独数组。
我如何转换它:
int[,] dummyArray = new int[,] { {1,2,3}, {4,5,6}};
进入list<int[]>
,其中包含两个值为{1,2,3}
和{4,5,6}
的数组?
答案 0 :(得分:4)
您可以将2d数组转换为jagged array,然后转换为convert it to List。
int[,] arr = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
int[][] jagged = new int[arr.GetLength(0)][];
for (int i = 0; i < arr.GetLength(0); i++)
{
jagged[i] = new int[arr.GetLength(1)];
for (int j = 0; j < arr.GetLength(1); j++)
{
jagged[i][j] = arr[i, j];
}
}
List<int[]> list = jagged.ToList();
答案 1 :(得分:4)
您可以使用Linq:
int[,] dummyArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
int count = 0;
List<int[]> list = dummyArray.Cast<int>()
.GroupBy(x => count++ / dummyArray.GetLength(1))
.Select(g => g.ToArray())
.ToList();
答案 2 :(得分:1)
你可以像这样使用for循环:
int[,] dummyArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
int size1 = dummyArray.GetLength(1);
int size0 = dummyArray.GetLength(0);
List<int[]> list = new List<int[]>();
for (int i = 0; i < size0; i++)
{
List<int> newList = new List<int>();
for (int j = 0; j < size1; j++)
{
newList.Add(dummyArray[i, j]);
}
list.Add(newList.ToArray());
}
答案 3 :(得分:0)
这是一个可重用的实现
public static class Utils
{
public static List<T[]> To1DArrayList<T>(this T[,] source)
{
if (source == null) throw new ArgumentNullException("source");
int rowCount = source.GetLength(0), colCount = source.GetLength(1);
var list = new List<T[]>(rowCount);
for (int row = 0; row < rowCount; row++)
{
var data = new T[colCount];
for (int col = 0; col < data.Length; col++)
data[col] = source[row, col];
list.Add(data);
}
return list;
}
}
和样本用法
var source = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
var result = source.To1DArrayList();
对其他答案的一些评论。
M.kazem Akhgary:如果我需要列表,我就不知道为什么要先创建锯齿状阵列和转换它到列表,而不是直接创建列表。
Eser:我通常喜欢他优雅的Linq解决方案,但这肯定不是其中之一。如果想要使用Linq(尽管我坚信它并非打算这样做),以下内容会更合适:
var source = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
var result = Enumerable.Range(0, source.GetLength(0))
.Select(row => Enumerable.Range(0, source.GetLength(1))
.Select(col => source[row, col]).ToArray())
.ToList();