public void Load(string path) { var emittersBySystem = new Dictionary <string, PartSysSpec>(); using (var file = new FileStream(path, FileMode.Open)) { var reader = new StreamReader(file, Encoding.ASCII); // Slurp in all lines, do a preliminary sorting by particle system name string line; while ((line = reader.ReadLine()) != null) { var firstTab = line.IndexOf('\t'); if (firstTab == -1) { continue; // Not a valid line } var systemName = line.Substring(0, firstTab); if (systemName.Length == 0) { continue; // Also probably not a valid line } // Trim it by removing the vertical tab at the end systemName = systemName.Replace("\v", ""); var key = systemName.ToLowerInvariant(); if (!emittersBySystem.ContainsKey(key)) { emittersBySystem[key] = new PartSysSpec { Name = systemName }; } emittersBySystem[key].Emitters.Add(EmitterSpec.Parse(line)); } } // Sort by name ascending var list = emittersBySystem.Values.ToList(); list.Sort(); Specs = new ObservableCollection <PartSysSpec>(list); }