Заполните массив объектов из namevaluecollection в C#

Я новичок в 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 ответа

Решение

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

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

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
}

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

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

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

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

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

Другие вопросы по тегам