使用循环填充二维数组
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();
虽然我不明白你为什么想要一个二维数组。
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[][]
我正在尝试解析文件中以竖线分隔的文本行 - 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();
虽然我不明白你为什么想要一个二维数组。
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[][]