1

私はC#が初めてです。ここに私が働いたハードコードされたものがあります:

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

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

これを一般化して、Update オブジェクトで無数のアイテムをサポートするようにしたいと思いましたが、コンパイルに失敗しました。

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
}
4

4 に答える 4

3

Itemsコレクションのサイズはさまざまである可​​能性があるため、配列のようなList<T>、またはDictionary<K,V>配列の代わりにコレクションタイプを使用する必要があります。

于 2009-03-19T18:26:18.860 に答える
2

現在のコンパイラエラーについては、次のようにmetaData配列を初期化する必要があります。

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

linqを使用すると、次のことができます。

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
}
于 2009-03-19T18:29:24.437 に答える
1

私が間違っていなければ、InputProperty配列は初期化されません。2行目をこれに変更した場合:

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

それはそれを修正する必要があります。

于 2009-03-19T18:29:54.670 に答える
0

配列InputProperty[]metaDataを宣言したとき、それを初期化しませんでした。そのため、メンバーにアクセスしようとしたときに、そのメンバーが存在しないため、エラーが発生しました。

Joelが推奨したように、System.Collections.Genericで提供されているコレクションタイプを調べて、適切なものを探すことをお勧めします。

于 2009-03-19T18:31:42.310 に答える