使用循环填充二维数组

3
我正在尝试解析来自文件的管道分隔文本行 - HL7消息段 - 以使该段成为HL7消息对象的属性。我认为我基本上不理解n维数组的概念...该段看起来像这样:MSH | ^〜\& || X530 ^ X530 ^ FID | ERIC ^ NSCC ^ RSSI | NSCCH | .... 我想创建一个数组,如下所示:数组中的第一项= {"0","MSH"},数组中的下一项= {"1,","^〜\&"},数组中的下一项= {"2,",null},数组中的下一项= {"3,","X530 ^ X530 ^ FID"}。我收到错误消息:

error message

    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;
    }

为什么需要一个二维数组? - kkica
4个回答

3

您的 2D 数组的每个子数组都有 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[][]

2

为了理解您这种情况下的基本数组,您可以将数组视为2D矩阵。同样,您可以将3D数组视为立方体。您试图做的是在一个地方添加两个项目。

最初的回答:

要了解您这种情况下的基本数组,可以将数组视为2D矩阵。同样,您可以将3D数组视为立方体。您尝试的是在一个位置添加两个项目。

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

因此,在第一次迭代中,符号[i,i]的值为[0,0],这意味着第一行中的第一个元素。 按照给定答案所示的方式可以正确地插入它们两个。

Original Answer翻译成“最初的回答”

fieldAndIndex [i,i] = i.ToString();
fieldAndIndex [i,++i] = field.ToString();

我希望这可以解决您的问题,建议您对多维数组进行一些研究。以下是一些很好的链接,可帮助您开始学习这些数组:这个这个。最初的回答。

1
 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;
    }

您不需要2D数组(矩阵)来解析它(调用fieldAndIndex [n]只会给出它的值-fieldAndIndex [1] ==“^〜\&amp;”),但如果您确实需要:
    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;
    }

1

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

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接