前几天我有一个有趣的面试问题,我真的很挣扎。(非常雄心勃勃的)规范要求我用 C# 为两个不同的数据流编写解析器。这是第一个流的虚构示例:
30=EUR/USD,35=3,50=ON,51=12.5,52=13.5,50=6M,51=15.4,52=16.2,50=1Y,51=17.2,52=18.3
其中 30 是货币对,35 是期限数,50、51、52 分别是期限、买入价和卖出价。买价和卖价是可选的,但正确的价-卖价元组将至少具有两个价格中的一个。他们提供的框架代码暗示解析这一行的结果应该是 3 个单独的对象(DataElement 实例)。我最终得到了一个相当讨厌的 switch 语句和基于循环的实现,我不确定它是否真的有效。
有什么技术可以读取这种流?我试图用递归找出一些东西,但我做错了。
编辑:基于@evanmcdonnall 的回答(已接受),这里是完整的编译和工作代码,以防它对其他人有用。
List<DataElement> Parse(string row)
{
string currency=string.Empty;
DataElement[] elements = null;
int j = 0;
bool start = false;
string[] tokens = row.Split(',');
for (int i = 0; i < tokens.Length; i++)
{
string[] kv = tokens[i].Split('=');
switch (kv[0])
{
case "30":
currency = kv[1];
break;
case "35":
elements = new DataElement[int.Parse(kv[1])];
break;
case "50":
if (start)
j++;
elements[j] = new DataElement() { currency = currency, tenor = kv[1] };
start = true;
break;
case "51":
elements[j].bid = double.Parse(kv[1]);
break;
case "52":
elements[j].ask = double.Parse(kv[1]);
break;
}
}
return elements.ToList();
}
主要概念是:
- 为每行中重复项目的“内循环”有一个单独的计数器
- 有一个布尔标志来指示“内循环”何时开始
- 分配对象数组以将“内循环”结果存储在长度已知的点(即标记 50)
- 为了简单明了,有一个只读取一行的函数,然后从一个单独的函数中多次调用它。