2016-09-01 2 views
3

Предположим, что у меня есть массив строк - countryNames[] - содержащие имена стран мира:Присвоить значение из строки массива в свойстве строки каждого элемента пользовательского типа массива

string[] countryNames = { "Afghanistan" , "Albania" , "Algeria", ... } 

I также класс называется Country, содержащим эти свойства, в частности:

public string CountryCode { get; set; } 
public string Name { get; set; } 

Моя цель состоит в том, чтобы создать массив пользовательского типа Country и присвоить Country.Name свойству каждого элемента Country[] в соответствующее строковое значение индекса countryNames[]. Я попытался сделать это следующим образом, в тот же метод, где я реализовал массив строк:

Country[] countries = new Country[193]; 
for (int i = 0; i < 193; i++) 
{ 
    countries[i].Name = countryNames[i]; 
} 
return countries; 

countries[i].Name однако, вызывает NullReferenceException. Я не вижу, где проблема, поскольку свойство Country.Name является строкой. Существуют ли какие-либо осложнения при смешивании массивов и свойств?

Спасибо, ребята!

+1

Недостаточно инициализации массива. Вы должны создать объекты страны перед вводом цикла for и добавить их в массив. Затем вы можете присвоить значение для свойства Name каждой страны. – Sagar

ответ

6

The причина, почему вы получаете NullReferenceException, заключается в том, что при инициализации массива объекта он не инициализирует элементы внутри него. Это означает, что при доступе countries[i].Name этот объект не существует, а затем .Name выдает исключение.

Таким образом, вы должны инициализировать его:

for (int i = 0; i < 193; i++) 
{ 
    countries[i] = new Country { Name = countryNames[i] }; 
} 

лучший способ, что использование для петли с помощью foreach:

List<Country> countries = new List<Country>(); 
foreach(var countryName in countryNames 
{ 
    countries.Add(new Country { Name = countryName }); 
} 

А затем из Еогеаспа вы можете перескочить к LINQ:

string[] countryNames = { "Afghanistan", "Albania", "Algeria" }; 
var countried = countryNames.Select(item => new Country { Name = item }); 
+0

Спасибо. Метод Linq еще лучше, так как он выполняет задание в одной строке кода! – Renato

+0

@RenatodeA. - Добро пожаловать :) –

2

Вы должны сделать новый Country первый:

Country[] countries = new Country[193]; 

for (int i = 0; i < 193; i++) 
{ 
    countries[i] = new Country(); 
    countries[i].Name = countryNames[i]; 
} 

return countries; 

Поступая:

Country[] countries = new Country[193]; 

Вы только резервируя пространство для массива, отдельные элементы инициализируются null