Заполните массив объектов из 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, чтобы найти что-то подходящее.