Add data into lists at runtime, from a database
regarding your concerns.

1) I do not believe this initialization is a problem but if later on it will be a problem, you can always change it to lazy initialization.

2,3) I just paste a similar code that I find more readable and improves your loop when you want to find the parent area.

    public class Data
    {
        public List&lt;Area&gt; Areas = new List&lt;Area&gt;();

        public Data(string[,] areasArray)
        {
            for (int i = 0; i &lt; areasArray.GetLength(0); i++)
            {
                var areaName = areasArray[i, 0];
                var parentAreaName = areasArray[i, 1];

                if (string.IsNullOrEmpty(parentAreaName))
                {
                    Areas.Add(new Area() { Name = areaName });
                }
                else
                {
                    var parentArea = Areas.First(a =&gt; a.Name == parentAreaName);
                    parentArea.SubAreas.Add(new Area() { Name = areaName });
                }
            }
        }
    }


You can probably still improve the loop but I guess you will lost readability, so I would leave it like this unless you face a real performance issue.

Regards