3

私が達成したいことは次のとおりです。次の形式の文字列があります(実際の文字列は完全にランダムな例です):

01005010050

上記の文字列は、次のフィールドに分割されます。

0 100 50 100 50

私が達成したいのは、最後の 4 つのフィールドの合計を最初の 0 フィールドに入れることです。文字列をトークンまたは文字列内のフィールドの場所を識別するために使用できるもので装飾する機会があります。

[£+]0[£-][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]

次に、正規表現を使用して、開始トークンと終了トークンから内部値を取得します。どのフィールドがマスターであるかを特定する方法が必要になるため、別のトークンを使用することにしました。

[*][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]

次に、見つかった内部文字列を調べて、変換して追加するだけです。次に、元の文字列で開始 [£+] トークンと終了 [£-] トークンを削除し、[*] を計算された合計に置き換えます。これでうまくいくと思いますが、問題は文字列ごとに複数の合計を持つことができるということです。

[£+][*][£-][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]\r\n
[£+][*][£-][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]

だから私はフィールドにある種のIDを追加することを考えていました:

ID1[*][£+]ID1|100[£-][£+]ID1|50[£-][£+]ID1|100[£-][£+]ID1|50[£-]\r\n
ID2[*][£+]ID2|100[£-][£+]ID2|50[£-][£+]ID2|100[£-][£+]ID2|50[£-]

したがって、正規表現を使用して文字列を分割します。見つかった内部文字列をパイプ (|) で分割して、最初の値がキーになり、2 番目の値が値になるようにします。これらすべてを辞書か何かに追加します。次に、辞書内の各キーを調べてすべての合計を追加し、元の文字列からトークンを削除して、「Key[*]」をそのキーの見つかった合計に置き換える必要があります。

別のフィールドが合計の合計を保持できるという事実により、プロセスはさらに複雑になります。これがこれを行う論理的な方法であり、単純な解決策がある場合に物事を複雑にしすぎないことを最初に明確にしたかっただけです。文字列の形式を明確にするために、完全にランダムになる可能性があります。

abc1000cde50 where fields are:
abc 100 0 c d e 50 (total placed in field 3 from 2 + 7)

フィールドを装飾する機会がある理由は、この文字列が XML ファイルから構築され、これが合計フィールドであり、これがマスターであることを示す属性を持つことができるからです。文字列を作成するときに単純に値を追加できない理由は、実際の値を計算するなど、他の多くの計算が最初に実行されるためです (つまり、このフィールドは 0 ~ 500 の範囲です)。完成した構築済み文字列を返す直前に、最後に合計を計算するつもりでした。コードが構造化されている方法では、フィールドを分割する機能が失われるため、フィールドが文字列内のどこにあるかを示すトークンを配置し、その方法で合計を計算できます。

4

2 に答える 2

0

質問の最初の部分のみを扱います。

0 の後と何か != 0 の前で文字列を分割すると仮定します。

{
    string s = "01005010050";

    var ls = new List<int>();

    for (int n = 0; n < s.Length - 1; n++)
    {
        if ((int)s[n] == 48 && (int)s[n + 1] != 48) // 48 = Ascii(0)
        {
            s = s.Insert(n + 1, ";");
        }
    }

    ls = s.Split(';').Select(Int32.Parse).ToList();

    for (int n = 1; n < ls.Count(); n++)
    {
        ls[0] += ls[n];
    }
}
于 2013-03-17T09:24:22.997 に答える
0

入力文字列のフィールドを他の計算フィールドに置き換えるプロセスとして解決策を考えているようです。「達成したいのは、最後の 4 つのフィールドの合計を最初の 0 フィールドに入れることです」や「... 元の文字列からトークンを削除し、「Key[*]」を .. .」。これをプログラムしようとしている場合、プロセスを 3 つのステップで考えます (1) データを読み込み、計算を実行するのに便利な形式で保存します (2) 必要な計算を実行し、何らかの方法で結果を保存します (3)必要な形式で出力文字列を生成します。

于 2013-03-17T09:49:12.560 に答える