1

私が取り組んでいるプロジェクトで、 FOR-CASE構造に相当するC#のように見えるものを見つけました。

foreach (string param in params.Split(';'))
{
    string[] parts = param.Split('=');
    string key = parts[0].Trim().ToLower();
    string value = parts[1].Trim();
    switch (key)
    {
        case "param1": this.param1 = value; break;
        case "param2": this.param2 = value; break;
        case "param3": this.param3 = value; break;
        case "param4": this.param4 = value; break;
        default: break;
    }
}

(有罪を保護するために変数名が変更されました。)

このコードをどのように実装しますか?

4

7 に答える 7

6

あなたの質問のコードは、あなたがリンクしたコードのようなものではないと思います。

質問のコードは、コマンドラインツールを作成した場合に実行できるもののように見えます。

質問のコードの何が問題になっているのかわからないのは愚かですか?

別の方法は、リフレクションを使用してパラメーター値変数を埋めることです。私も時々そうしました。

ところで、私はかつて、唯一のフロー制御メカニズムとしてスイッチがあり、gosub/returnがないスクリプト言語でプログラムを作成しました。私のプログラムのコードは、リンク先のコードと少し似ています。すべてのケースの終わりに再割り当てされた一種の命令ポインタ変数の大規模なスイッチと、スイッチの周りのほぼ無限ループ。それは仕事を成し遂げました。

于 2008-12-02T21:03:01.593 に答える
4

クラスには、変数を保持するために使用する複数のフィールドがすでにあることがわかります。その場合、あなたがしていることは問題ありません。

それ以外の場合は、1つのHashTable(C#インデクサーをひねりとして追加する可能性があります)を使用して、それらすべてを保持できます。ループは次のようになります。

foreach (string param in params.Split(';'))
{
    string[] parts = param.Split('=');
    string key = parts[0].Trim().ToLower();
    string value = parts[1].Trim();
    MyHashTable[key] = value;
}

このアプローチの問題は、1つのタイプの値しか持たないことです。たとえば、パラメータリストにstring型とint型の両方を含めることができる場合、コードが煩雑になります。特に、エラーのチェックや検証などを実行する必要があります。

私は個人的にあなたがすでに持っているものに固執するでしょう。

于 2008-12-02T21:12:31.530 に答える
3

これにはリフレクションを使用できます。

Type t = this.GetType();
foreach (string param in params.Split(';'))
{    
    string[] parts = param.Split('=');    
    string key = parts[0].Trim().ToLower();    
    string value = parts[1].Trim();    

    t.GetProperty(key).SetValue(this, value, null);
}
于 2008-12-02T22:00:30.637 に答える
2

価値のあることとして、WTFの記事は、その外側のループが完全に役に立たなかったため、WTFでした。記事に記載されているように、ループしてテストするよりも、インデックス変数を直接設定する方が簡単で、より直接的でした。

于 2008-12-02T22:11:56.603 に答える
1

私がどちらかを理解しているかどうかはわかりませんが、あなたは自分自身を複雑にしているようです。車輪の再発明をせず、できるだけ多くのBCLクラスを使用してください。これらのクラスは効率的に機能し、多くの時間を節約できることが証明されています。Gugeが提案したように、Reflectionとともに、ある種の辞書<、>を使用して実装できるように思えます。

于 2008-12-02T21:15:23.723 に答える
0

実際、OPのコードは問題ないと思います。これは完全ではありません。もっと簡単でわかりやすい方法があるかもしれませんが、メンバー/プロパティ名と入力パラメーター名の間のマッピングを効果的に読み取ることができます。プロパティを強く型付けしたままにし (ハッシュマップ/辞書ソリューションとは異なり、クラスのすべてのプロパティに対して型が 1 つしかない場合を除きます...)、マッピングを修正または追加するかなり明白な場所を 1 つ提供します。

于 2008-12-12T16:13:43.003 に答える
-3

または正規表現:

string parms = "param1=1;param2=2;param3=3";
string[] parmArr = parms.Split(';');        

string parm1 = Regex.Replace(parmArr[0], "param1=", "");
string parm2 = Regex.Replace(parmArr[1], "param2=", "");
string parm3 = Regex.Replace(parmArr[2], "param3=", "");
于 2008-12-02T22:04:10.537 に答える