2009-03-19 15 views
1

C#を初めて使用しています。ここで私が働いてしまったハードコーディングされたものです:C言語のnamevaluecollectionからオブジェクトの配列を取り込みます。

InputProperty grantNumber = new InputProperty(); 
grantNumber.Name = "udf:Grant Number"; 
grantNumber.Val = "571-1238"; 

Update update = new Update(); 
update.Items = new InputProperty[] { grantNumber }; 

今、私は更新オブジェクト内の項目の不特定多数をサポートするために、これを一般化したいと私はこの思い付いたが、それはコンパイルに失敗します。

Update update = BuildMetaData(nvc); //call function to build Update object 

、ここで関数自体:

private Update BuildMetaData(NameValueCollection nvPairs) 
{ 
    Update update = new Update(); 
    InputProperty[] metaData;  // declare array of InputProperty objects 
    int i = 0; 
    foreach (string key in nvPairs.Keys) 
    { 
     metaData[i] = new InputProperty();  // compiler complains on this line 
     metaData[i].Name = "udf:" + key; 
     foreach (string value in nvPairs.GetValues(key)) 
      metaData[i].Val = value; 
    } 
    update.Items = metaData; 
    return update;  // return the Update object 
} 
+0

コンパイラからのエラーメッセージは何ですか? – harpo

+0

割り当てられていないローカル変数 'metaData'の使用 –

答えて

3

あなたのItemsコレクションのサイズが変わることがあるので、あなたはList<T>またはのようなコレクション型を使用する必要があります配列の代わりに210を使用します。現在のコンパイラエラーのために

+0

質問の冒頭で、update.ItemsにInputPropertyオブジェクトの配列を割り当てる必要があることを示してみました。私はまだリストと辞書を理解していません。 –

+0

それでは、学ぶのは楽しい時です。これらのクラスは多く使用されています。 –

+0

List のように、< >シンボルを持つこの構文のものについての良い入門情報はどこにありますか?辞書またはリストのような構文が表示されるたびに、私は霧がかかり、良いイントロが必要です。 –

2

、あなたは同様に、メタデータ配列を初期化する必要があります:あなたはできるLINQ使用

InputProperty[] metaData = new InputProperty[](nvPairs.Count); 

:私は間違っていない場合は

private Update BuildMetaData(NameValueCollection nvPairs) 
{ 
    Update update = new Update(); 
    update.Items = nvPairs.Keys 
     .Select(k=> new InputProperty 
        { 
         Name = "udf:" + k, 
         Val = nvPairs[k] // or Values = nvPairs.GetValues(k) 
        } 
     ) 
     .ToArray(); 
    return update;  // return the Update object 
} 
+0

あなたたち素晴らしいです - ありがとうございました。 –

+0

まさに私が言ったことは...(質問を時間通りに読んでいれば);-) – Cerebrus

+0

しかし、それは "nvPairs.Count"でなければなりません。 – Cerebrus

1

を、あなたのInputPropertyの配列です初期化されません。 2行目を次のように変更した場合:

InputProperty[] metaData = new InputProperty[nvPairs.Count]; 

修正する必要があります。

+0

皆さんは素晴らしいです - ありがとうございます。 –

0

あなたの配列InputProperty [] metaDataを宣言したとき、あなたはそれを初期化しませんでした。だから、あなたがメンバーにアクセスしようとしたとき、それは存在しないだけなので、あなたはあなたがしたエラーを持っています。

Joelがお勧めしますように、System.Collections.Genericで提供されているコレクションの種類を適切なものにすることをお勧めします。

関連する問題