我有一个2D字符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
答案 0 :(得分:3)
您可以替换循环以及必须使用单个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查询在开始时可能看起来更加模糊,但从长远来看,它值得付出努力,因为它会让你保存一个无论何时你必须对一组给定的项目进行选择/过滤/查询。
答案 1 :(得分:2)
Ditch(从代码中删除)第一个循环,包含24次迭代
使列表的逻辑添加:
matrixCharacters.Add(array[r,c].ToString() + (r * 4 + c).ToString());
变量r从0增加到5.对于r的每个值,c从0增加到3.这就是r * 4 + c从0到23的计数;它就像一个基数4:
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
...