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

时间:2017-12-13 00:15:58

标签: c# arrays multidimensional-array

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

2 个答案:

答案 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
...