Заполнить массив объектов из namevaluecollection в c # - PullRequest
1 голос
/ 19 марта 2009

Я новичок в 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 = 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 ]

3 голосов
/ 19 марта 2009

Поскольку размер вашей коллекции Items может варьироваться, вы должны использовать тип массива, например List<T> или Dictionary<K,V> вместо массива.

2 голосов
/ 19 марта 2009

Для текущей ошибки компилятора вам нужно инициализировать массив метаданных, например:

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
}
1 голос
/ 19 марта 2009

Если я не ошибаюсь, ваш массив InputProperty никогда не инициализируется. Если вы измените строку 2 на это:

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

Это должно исправить.

0 голосов
/ 19 марта 2009

Когда вы объявили свой массив InputProperty [] metaData, вы не инициализировали его. Поэтому, когда вы пытались получить доступ к члену, его просто не существует, поэтому вы получили сообщение об ошибке.

Как рекомендовал Джоэл, я бы посоветовал вам взглянуть на типы коллекций, представленные в System.Collections.Generic, чтобы найти что-то подходящее.

...