先日、インタビューで興味深い質問がありましたが、それには本当に苦労しました。(非常に野心的な) 仕様では、C# で 2 つの異なるデータ ストリーム用のパーサーを作成する必要がありました。最初のストリームの構成例を次に示します。
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 はそれぞれテナー、ビッド、アスクです。ビッドとアスクはオプションですが、正しいテナービッドアスクのタプルには、2 つの価格のうち少なくとも 1 つが含まれます。彼らが提供したフレームワーク コードは、この行を解析した結果が 3 つの個別のオブジェクト (DataElement インスタンス) になることを暗示していました。私はかなり厄介なスイッチステートメントとループベースの実装になりましたが、実際に機能したかどうかはわかりません.
この種のストリームを読み取るには、どのような手法がありますか? 再帰で何かを理解しようとしましたが、うまくいきませんでした。
編集:@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) で「内部ループ」の結果を格納します。
- 簡単かつ明確にするために、1 行だけを読み取る関数を用意し、別の関数から複数回呼び出します。