public void LoadTest()
        {
            var txt = @"
A,ABCD,NAME1,1.0,2.0,100,18000,18000,3000,0
R,09,95,3000,150,0,0.0,0,1.0,2.0,100,3.00,50,1,0
R,27,275,3000,150,0,0.0,0,1.0,2.0,100,3.00,50,1,0

A,EFGH,NAME2,1.0,2.0,100,3000,5000,2500,0
R,36,003,2500,100,0,0.0,0,1.0,2.0,100,3.00,50,1,0
R,18,183,2500,100,0,0.0,0,1.0,2.0,100,3.00,50,1,0
";

            var result   = AirportDataLoader.Load(txt.Lines());
            var err      = result.Errors;
            var airports = result.Airports;

            Assert.IsEmpty(err);
            Assert.AreEqual(2, airports.Count);

            var ap1   = airports["ABCD"];
            var rwy09 = new RwyData("09", "95", 3000, 150, true, false, "0.0", "0", 1.0, 2.0,
                                    100, 3.0, 50, AirportDataLoader.SurfTypes[1], 0);
            var rwy27 = new RwyData("27", "275", 3000, 150, true, false, "0.0", "0", 1.0, 2.0,
                                    100, 3.0, 50, AirportDataLoader.SurfTypes[1], 0);

            var expected1 = new Airport("ABCD", "NAME1", 1.0, 2.0, 100, true, 18000, 18000, 3000,
                                        new[] { rwy09, rwy27 });

            Assert.IsTrue(expected1.Equals(ap1));

            var ap2 = airports["EFGH"];

            Assert.AreEqual("NAME2", ap2.Name);
            Assert.IsTrue(ap2.Rwys.Select(r => r.RwyIdent).SetEquals("18", "36"));
        }
        private MultiMap <string, RwyData> LoadRwys()
        {
            string rwyFile = folderpath + @"\runways.csv";
            var    lines   = File.ReadAllLines(rwyFile);

            var rwys      = new MultiMap <string, RwyData>();
            var surfTypes = new Dictionary <string, string>();

            // Ignore first line.
            for (int i = 1; i < lines.Length; i++)
            {
                try
                {
                    var words = lines[i].Split(',');
                    var icao  = words[2].Trim('"');
                    var id    = words[8].Trim('"');

                    // Reduce memory usage by sharing these strings.
                    var surface = words[5].Trim('"', ' ');
                    if (surfTypes.ContainsKey(surface))
                    {
                        surface = surfTypes[surface];
                    }
                    else
                    {
                        surfTypes[surface] = surface;
                    }

                    if (!double.TryParse(words[3], out var len) ||
                        !double.TryParse(words[4], out var width) ||
                        !double.TryParse(words[9], out var lat) ||
                        !double.TryParse(words[10], out var lon) ||
                        !double.TryParse(words[11], out var elev) ||
                        !double.TryParse(words[13], out var heading))
                    {
                        continue;
                    }

                    var r = new RwyData(id, RoundToInt(heading).ToString(), RoundToInt(len),
                                        RoundToInt(width), false, false, "", "", lat, lon, RoundToInt(elev), 0.0,
                                        0, surface, -1);

                    rwys.Add(icao, r);
                    id = words[15].Trim('"');

                    if (!double.TryParse(words[16], out lat) ||
                        !double.TryParse(words[17], out lon) ||
                        !double.TryParse(words[18], out elev) ||
                        !double.TryParse(words[20], out heading))
                    {
                        continue;
                    }

                    r = new RwyData(id, RoundToInt(heading).ToString(), RoundToInt(len),
                                    RoundToInt(width), false, false, "", "", lat, lon, RoundToInt(elev), 0.0,
                                    0, surface, -1);

                    rwys.Add(icao, r);
                }
                catch
                { }
            }

            return(rwys);
        }