将2D数组以连续顺序使用行项目转换为1D列表



我有一个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
...

最新更新