【发布时间】:2016-09-24 07:01:13
【问题描述】:
我有一个二维字符串数组。我想把它转换成
List<List<string>>
如何在 C# 中实现这一点?
【问题讨论】:
标签: c# list multidimensional-array
我有一个二维字符串数组。我想把它转换成
List<List<string>>
如何在 C# 中实现这一点?
【问题讨论】:
标签: c# list multidimensional-array
使用扩展。
public static List<List<T>> Convert2dToList<T>(this T[][] array)
{
if (array == null) return null;
List<List<T>> mainList = new List<List<T>>();
for (int i = 0; i < array.Length; i++)
{
List<T> list = array[i].ToList();
mainList.Add(list);
}
return mainList;
}
然后这样调用
static void Main(string[] args)
{
int[][] list = new int[3][]
{
new int[]{ -2,-3,3 },
new int[]{ -5,-10,1 },
new int[]{ 10,30,-5 }
};
List<List<int>> A = list.Convert2dToList();
}
【讨论】:
好吧,您可以使用自定义泛型 ToList() 方法扩展二维数组:
public static class ArrayHelper
{
public static List<List<T>> ToList<T>(this T[,] array)
{
var result = new List<List<T>>();
var lengthX = array.GetLength(0);
var lengthY = array.GetLength(1);
// the reason why we get lengths of dimensions before looping through
// is because we would like to use `List<T>(int length)` overload
// this will prevent constant resizing of its underlying array and improve performance
for(int i = 0; i < lengthX i++)
{
var listToAdd = new List<T>(lengthY);
for(int i2 = 0; i2 < lengthY; i2++)
{
listToAdd.Add(array[i, i2]);
}
result.Add(listToAdd);
}
return result;
}
}
只需一行代码就可以相当简单地使用它:
public class Program
{
public static void Main()
{
int[,] array = new int[2,2] {{5,7},{9,14}};
var result = array.ToList();
}
}
【讨论】:
我更喜欢 Hari 的回答,但如果由于某种原因您无法访问 Linq (.NET Framework
List<List<string>> lLString = new List<List<string>>();
string[,] stringArray2D = new string[3, 3] {
{ "a", "b", "c" },
{ "d", "e", "f" },
{ "g", "h", "i" },
};
for (int i = 0; i < stringArray2D.GetLength(0); i++) {
List<string> temp = new List<string>();
for (int j = 0; j < stringArray2D.GetLength(1); j++) {
temp.Add(stringArray2D[i,j]);
}
lLString.Add(temp);
}
第一个循环遍历行,下一个循环遍历列。所有列 (strings) 都添加到单个 List<string> 对象中,然后在退出内部循环时将其添加到父 List<List<string>> 对象中。
我已经包含了这些,因为二维数组实际上是指jagged array(非矩形)。由于这是一个数组数组,您可以简单地通过索引访问内部数组,然后在其上调用 .ToList()。
List<List<string>> lLString = new List<List<string>>();
string[][] jaggedStringArray = new string[3][];
jaggedStringArray[0] = new string[] { "a", "b", "c" };
jaggedStringArray[1] = new string[] { "d", "e", "f", "g", "h" };
jaggedStringArray[2] = new string[] { "i" };
for (int i = 0; i < jaggedStringArray.Length; i++) {
lLString.Add(jaggedStringArray[i].ToList());
}
如果您使用的是锯齿状数组并且 .NET Framework >= 3.5,您可以像这样将它与 Linq 结合使用
List<List<string>> lLString = jaggedStringArray.Select(x => x.ToList()).ToList();
【讨论】:
另一种方法是使用 LINQ 等效的嵌套 for 循环:
string[,] array = { { "00", "01", "02"}, { "10", "11", "12" } };
var list = Enumerable.Range(0, array.GetLength(0))
.Select(row => Enumerable.Range(0, array.GetLength(1))
.Select(col => array[row, col]).ToList()).ToList();
【讨论】:
要生成需要的列表,可以这样用:
public static List<List<string>> GenerateListOfListOfStrings(string[,] result)
{
string[,] res = result;
List<List<string>> listObj = new List<List<string>>();
var list = new List<string>();
foreach (var s in result)
{
list.Add(s);
}
listObj.Add(list);
return listObj;
}
【讨论】:
使用Linq 你可以做到这一点。
var result list.Cast<string>()
.Select((x,i)=> new {x, index = i/list.GetLength(1)}) // Use overloaded 'Select' and calculate row index.
.GroupBy(x=>x.index) // Group on Row index
.Select(x=>x.Select(s=>s.x).ToList()) // Create List for each group.
.ToList();
检查这个example
【讨论】:
从二维数组到列表
double[,] d = new double[,]
{
{1.0, 2.0},
{3.0, 4.0},
{5.0, 6.0},
{7.0, 8.0},
{9.0, 10.0}
};
List<double> lst = d.Cast<double>().ToList()
从二维数组到二维列表
【讨论】:
List<List<>>