1

見積もりサーバーにリクエストを送信する必要があります。各リクエストには固有のリクエスト番号(unsigned int)が必要です。これにより、引用符が添付されたリクエスト番号とともに返されるときに、それらの引用符がどのシンボルに属しているかがわかります。このタイプのケースをエンコードする特別な文字はありますか?たとえば、「A」は13、「B」は14なので、「BA」記号の場合、リクエスト番号は1413になります。

4

4 に答える 4

3

文字を直接uintにマッピングする場合、記号が6文字以下であることを保証できますか?そうでない場合は、可能なuint値よりも多くの可能なシンボル値があります。

いずれにせよ、リクエスト番号のポイントは、リクエストに関する情報をエンコードすることではありません。むしろ、要求番号のディクショナリ(キーとして)と応答の処理に関する情報(値として)を保持する必要があります。あなたのアプローチでは、同じシンボルに対して複数のリクエストがある場合、同じリクエスト番号を共有する異なるリクエストになってしまいます。

たとえば、応答をシンボルにマップする場合は、次のように実行できます。

private Dictionary<uint, string> _requests = new Dictionary<int, string>();
private uint _requestNumber = 0;

void SendRequest(string symbol)
{
    uint currentRequestNumber = _requestNumber++;
    _requests[currentRequestNumber] = symbol;
    //... send request using currentRequestNumber
}

void ReceiveResponse(Response response)
{
    string symbol = _requests[response.RequestNumber];
    _requests.Remove(response.RequestNumber);
    //...do something with the response...
}

これはスレッドセーフではありません。アイデアを説明するための単なるスケッチです。

尋ねられた質問に答えるために、可能な記号値の範囲が十分に小さい場合は、質問で概説したアプローチを採用できます。各文字は2桁の数字にマップされ、これらの数字を単純に連結します。このアプローチを使用している既存のシステムを私は知りません。

このアプローチは、どのシンボルにも対応できない多くのuint値を浪費します。たとえば、Aが10、Zが35、\が36の場合、これらの範囲は無駄になります:0〜9、37-1009、1037-1109など。

もう1つのオプションは、記号を基数27の数値('A'から'Z'プラス'\'は有効な数字)として解釈し、基数10に変換することです。

サンプルコードが必要な場合は、可能なシンボル値の範囲に関する詳細情報を提供してください。

于 2012-04-03T21:27:49.427 に答える
2

キャラクターは常に大文字のAZになりますか?もしそうなら、このような単純なものはあなたが説明した方法でそれを変換します:

var symbol = "BA";
var encoded = symbol.Aggregate(0u, (acc, c) => (uint)(acc * 100 + c - 'A' + 13));
于 2012-04-03T21:24:39.373 に答える
1

A = 13、B = 14、...、Z=38と仮定します

この変換を行う簡単な関数を作成できます。何かのようなもの:

uint output = 0;
foreach (char c in inpStr) {
    output = output * 100 + (13 + c - 'A');
}
return output;

ここで、例ではinpStr="BA"です。

于 2012-04-03T21:28:07.037 に答える
1

記号が常に大文字の場合は、次のようなマッピングを作成できます。

uint result = 0;
uint power = 1;

for (int i=0; i < input.Length; i++)
{
  uint digitValue = power * (input[i] - 'A');
  result += digitValue;
  power *= 26;
}

これにより、シンボルが基数26の数値(数字は「A」から「Z」)であると効果的に見なされ、基数10に変換され、「1」の数字が最も左になります(標準の数値の逆ですが、関係がないためです。内部的に一貫しています)。数字を1桁の左側として扱いたい場合は、に変更する必要がありinput[i]ますinput[input.Length - i]

更新 「/」記号も許可されていることを明確にした上で、「ベース」を26から27に変換し、「Z」のすぐ上に「/」を並べ替えます(任意ですが簡単です)。input[i]が'/'であるかどうかをテストし、その場合は結果のパワー*27を割り当てる必要があります。

于 2012-04-03T21:28:12.077 に答える