public void ProcessBlock(List <string> block) { var firstLine = block.First(); if (firstLine.StartsWith("K0100")) { var values = firstLine.Split(' '); int numberOfCharacteristics; if (!int.TryParse(values[1], out numberOfCharacteristics)) { throw new Exception("Value of field K0100 is invalid."); } while (numberOfCharacteristics > Characteristics.Count) { Characteristics.Add(new Characteristic()); } firstLine = block[1]; } if (firstLine.StartsWith("K0999")) { //todo finish } if (firstLine.StartsWith("K1")) { //process part data var part = PartConverter.Convert(block); if (part != null) { Parts.Add(part); _currentPart = part; } } else if (firstLine.StartsWith("K2")) { //process characteristic data CharacteristicConverter.Convert(block, Characteristics.ToArray()); } else if (firstLine.StartsWith("K00") || char.IsNumber(firstLine[0])) { if (_currentPart == null) { throw new Exception("Invalid key structure. Part information should be processed before any measurements."); } //process value portion //part and characteristic sections are considered finished now so make sure we got all processed characteristics assigned to current part if (_currentPart.Characteristics == null) { //assign characteristics to _current part _currentPart.Characteristics = Characteristics.Where(p => string.IsNullOrEmpty(p.PartNumber) && !string.IsNullOrEmpty(p.Number)).ToArray(); foreach (var currentPartCharacteristic in _currentPart.Characteristics) { currentPartCharacteristic.PartNumber = _currentPart.Number; } } MeasurementConverter.Convert(block, _currentPart.Characteristics); } }