我有一个2D char array
。
我想通过连续顺序循环并将每个char
index
添加到新的1D list
。
因此,新的1D列表将显示为:
G0
V1
H2
F3
I4
E5
V6
A7
U8
G9
N10
L11
...
c#
char[,] array = new char[6,4] {
{ 'G', 'V', 'H', 'F' },
{ 'I', 'E', 'V', 'A' },
{ 'U', 'G', 'N', 'L' },
{ 'G', 'X', 'F', 'W' },
{ 'E', 'N', 'L', 'H' },
{ 'A', 'H', 'V', 'B' }
};
List<string> matrixCharacters = new List<string>();
for (int m = 0; m < 24; m++) // marix positions 24
{
for (int r = 0; r < 6; r++) // matrix rows 6
{
for (int c = 0; c < 4; c++) // matrix columns 4
{
matrixCharacters.Add(array[r,c].ToString() + r.ToString());
}
}
}
但是我很难做一个可以做到的循环。
这显示:
http://rextester.com/rprxm23687
G0
V0
H0
F0
I1
E1
V1
A1
U2
G2
N2
L2
...
方法2显示:
http://rextester.com/tylje96460
GVHF0
IEVA1
UGNL2
GXFW3
ENLH4
AHVB5
您可以替换循环,而必须用单个LINQ查询手动创建列表,这也将使整个代码更加紧凑:
var list = array.Cast<char>().Select((c, i) => $"{c}{i}").ToList();
让我们看一下它的工作原理:
-
array.Cast<char>()
-这将2D矩阵扁平化为线性阵列,或者更确切地说,它列举了2D数组中的项目,就好像它是线性阵列一样。在这样的情况下,这很有用,您有兴趣浏览每个项目,而无需实际创建其他列表或将原始数据复制到另一个数据结构中。 -
Select((c, i) => $"{c}{i}")
-这将选择功能应用于上一个序列中的每个项目。由于我们对Cast<char>()
的结果进行了调用,因此这将应用我们的功能到原始列表中的每个字符。在这种情况下,该函数在列表中使用两个参数(c, i)
,一个字符及其索引,并返回字符串$"{c}{i}"
。我们正在使用字符串插值,因此{}括号之间的值将是我们在lambda函数中的参数。回顾一下,原始数组中的每个项目都将与其索引一起选择,并且此功能的结果将是包含{c}
及其索引的值本身的字符串,由{i}
给出。
给出。 -
ToList()
-这只是创建一个列表,其中包括上一个查询中的结果。
长期进入LINQ方法是一个好主意,因为在这种情况下,它们通常比手动循环易于错误。
如果您是C#的新手,Linq查询似乎更晦涩在给定的一组项目上进行一些选择/过滤/查询。
ditch(从您的代码中删除)24迭代
的第一个循环使列表的逻辑添加:
matrixCharacters.Add(array[r,c].ToString() + (r * 4 + c).ToString());
变量r从0到5。对于r的每个值,c从0到3。这就是为什么r*4 c从0到23的计数;就像一个基本数字:
0*4+0=0
0*4+1=1
0*4+2=2
0*4+3=3
1*4+0=4 //c back to 0, r up to 1
...