使用循环填充二维数组

Populate 2D arrays using a loop

我正在尝试解析文件中以竖线分隔的文本行 - HL7 消息段 - 使该段成为 HL7 消息对象的 属性。

我想我根本不理解n维数组的概念...

片段看起来像这样

MSH|^~\&||X530^X530^FID|ERIC^NSCC^RSSI|NSCCH|....

我想这样创建一个数组;

数组中的第一项 = {"0","MSH"}

数组中的下一项 = {"1,", "^~\&"}

数组中的下一项 = {"2,", null}

数组中的下一项 = {"3,", "X530^X530^FID"}

我收到错误消息:

    private string [,] ParseSegment(string ms)
    {
        int i = 0;
        string[] segmentFields = ms.Split('|');//fields for this segment
        int arrayLength = segmentFields.Length;
        string[,] fieldAndIndex = new string[arrayLength,1];

        foreach (string field in segmentFields)
        {
            fieldAndIndex [i,i] = {{ i,field} };//I'm not sure what to do here!!!!
        }

        return fieldAndIndex;
    }
 private string [] ParseSegment(string ms) //you do not need 2d array for that
    {
        int i = 0;
        string[] segmentFields = ms.Split('|');//fields for this segment
        int arrayLength = segmentFields.Length;
        string[] fieldAndIndex = new string[arrayLength];

        foreach (string field in segmentFields)
        {
            fieldAndIndex [i] = field;
            i++;
        }

        return fieldAndIndex;
    }

你不需要二维数组(矩阵)来解析它(调用 fieldAndIndex[n] 只会给出它的值 - fieldAndIndex[1] == "^~\&""),但如果你真的需要:

    private string [,] ParseSegment(string ms) 
    {
        int i = 0;
        string[] segmentFields = ms.Split('|');//fields for this segment
        int arrayLength = segmentFields.Length;
        string[,] fieldAndIndex = new string[arrayLength,2];

        foreach (string field in segmentFields)
        {
            fieldAndIndex [i][0] = i;
            fieldAndIndex [i][1] = field;
            i++;
        }

        return fieldAndIndex;
    }

要了解您的案例中的基本数组,您可以将该数组视为二维矩阵。同样,您可以将 3D 数组视为立方体。您要做的是在一个地方添加两项

fieldAndIndex [i,i] = {{ i,field} };

因此在第一次迭代期间,符号 [i,i] 的计算结果为 [0,0],这意味着第一行中的第一个元素。 插入这两者的正确方法可以按照给定的答案

所示完成
fieldAndIndex [i,i] = i.ToString();
fieldAndIndex [i,++i] = field.ToString();

我希望这能解决您的问题,最好对多维数组进行一些研究。 This and This 是开始使用这些阵列的一些很好的链接。

虽然我不明白你为什么想要一个二维数组。

new string[arrayLength,1]; 应该是 new string[arrayLength,2];

[i,i] 需要 1 个元素,而不是 2 个。您还需要使用 [i,0][i,1]

private string [,] ParseSegment(string ms)
{
    int i = 0;
    string[] segmentFields = ms.Split('|');//fields for this segment
    int arrayLength = segmentFields.Length;
    string[,] fieldAndIndex = new string[arrayLength,2];

    foreach (string field in segmentFields)
    {
        fieldAndIndex [i,0] =  i.ToString();
        fieldAndIndex [i,1] =  field;
        i++;
    }

    return fieldAndIndex;
}

二维数组的每个子数组都有 2 个项目(对吧?),所以长度应该是 2 而不是 1

string[,] fieldAndIndex = new string[arrayLength, 2];

因为你想在循环中使用计数器变量 I,你不应该使用 foreach 循环:

for (int i = 0 ; i < arrayLength ; i++) {
    // here you want the first item of the subarray to be i, and the second item to be the corresponding segment
    fieldAndIndex[i, 0] = i.ToString();
    fieldAndIndex[i, 1] = segmentFields[i];
}

另外,我认为二维数组不适合这里。存储每个元素的索引(这似乎是您想要做的)是不必要的,因为 fieldAndIndex[x, 0] 将始终与 x!

相同

您可能想改用简单的一维数组。还有其他可能有用的数据结构:

  • Dictionary<int, string>
  • (int, string)[]
  • string[][]