0

私は今日この問題に直面していましたが、満足のいく解決策が見つからなかったため、クラスの設計を変更し、タグ 1、タグ 2、タグ 3 などの個別のプロパティを持つことにしました。

私の主な問題は、他のプロパティのリストを含むオブジェクトにグリッドをバインドする必要があり、リスト内の各項目を個別の列として表示する必要があるという事実です。したがって、変数を個別に宣言することに頼っています。元の質問はこちら...

今、私はおそらくすべてのプログラマーが一度は直面する、最も一般的な設計上の問題の 1 つに直面しています。これを示すコードは次のとおりです。

for (int i = 0; i < tags.Length; ++i) // Length not known here.
{
    if(i==0){
        tag1 = tags[0];
    } 
    else if(i == 1){
        tag2 = tags[1];
    }
    else if(i == 2){
        tag3 = tags[2];
    }
    ....
}

これtagsが文字列配列です。

これを行うためのよりエレガントな方法があるかどうか疑問に思っていました。注意すべきもう 1 つのことは、このループの効率は、進行するにつれて低下することです。これは、反復が増えると、より多くの条件をチェックする必要があるためです。一度真になった後に条件を削除できれば、各反復で各条件が一度だけ真になることがわかっているため、各反復が高速化されます。

4

3 に答える 3

7

についての回答DataGridViewと使用ComponentModelを正しい質問に移動しました: グリッド ビューにリストを含むオブジェクトのリストを表示する

ブリーフィング

DataGridViewコントロールは名前空間をサポートしているため、ComponentModel存在しないプロパティを持つように見えるクラスを作成できます。が使用するのと同じメカニズムPropertyGridです。

サンプルコードは、その質問のこの回答にあります: https://stackoverflow.com/a/13078735/195417

古い答え

これは、本当の質問がコントロールに関するものであることに気付いていなかったときの私の以前の回答でしたDataGridView


これは値を直接設定するのと同じではありませんか:

this.tag1 = tags[0];
this.tag2 = tags[1];
this.tag3 = tags[2];

編集:あなたが言ったように、必要な変数の数がわからない場合、必要なのは1つだけです。それはリストです:

var list = new List<string>();
for (int i = 0; i < tags.Length; ++i)
{
    list.add(tags[i]);
}

すべての値をコピーすることだけが必要な場合は、次のようにすることもできます。

var list = new List<string>(tags);

これがあなたが望むものかどうか教えてください...多分私は質問を誤解しました.

于 2012-10-25T20:35:17.790 に答える
1

ループ全体は無意味です。ただし、タグ配列の長さが常に同じになる場合を除き、範囲外にならないようにする必要があります...

if(tags.Length >= 1) this.tag1 = tags[0];
if(tags.Length >= 2) this.tag2 = tags[1];
if(tags.Length >= 3) this.tag3 = tags[2];
if(tags.Length >= 4) this.tag4 = tags[3];
if(tags.Length >= 5) this.tag5 = tags[4];

...あなたが持っているthis.tag#の数についても同様です。

于 2012-10-25T21:05:19.453 に答える
-3

これは本質的に同じです:

for(int index = 0; index < tags.Length[]; index++){
    switch(index){
        case 0:
            tag1 = tags[0];
            break;
            // And so on
    }
}
于 2012-10-25T20:41:33.240 に答える