public bool MoveNext() { while (this.stack.Count > 0) { var itr = this.stack.Peek(); if (this.needMoveNext && !itr.MoveNext()) { return(false); } this.needMoveNext = false; var r = itr.Current; if (r == null) { return(false); } if (r.Records.Count > 0) { itr = new RecordIterator(itr.Current, -1, this.forward); this.stack.Push(itr); } while (true) { bool ok = itr.MoveNext(); if (ok) { return(true); } this.stack.Pop(); if (this.stack.Count == 0) { return(false); } itr = this.stack.Peek(); } } return(false); }
/// <summary> /// If a record contains a field that can't be parsed as a double, the whole /// record is skipped. /// </summary> public static IDataSeries[] ReadDataSeries(RecordIterator it, bool useHeaders) { if (!it.MoveNext()) { return(null); } IList <string> record = it.Current; // read first record int columns = record.Count; if (columns < 1) { throw new ArgumentException(); } DataSeries.ListDataSeries[] serieses = new DataSeries.ListDataSeries[columns]; for (int col = 0; col < columns; col++) { DataSeries.ListDataSeries series = new DataSeries.ListDataSeries("y" + col); if (col == 0) { series.SetName("x"); } else { series.SetDomain(serieses[0]); } serieses[col] = series; } if (useHeaders) { // first record contains header strings for (int i = 0; i < record.Count && i < serieses.Length; i++) { serieses[i].SetName(record[i]); } record = it.Current; } while (true) { try { double[] values = new double[columns]; for (int col_1 = 0; col_1 < columns; col_1++) { values[col_1] = double.ValueOf(record[col_1]); } for (int col_2 = 0; col_2 < columns; col_2++) { serieses[col_2].Add(values[col_2]); } } catch (NumberFormatException) { } // skip whole record if (!it.MoveNext()) { break; } record = it.Current; } return(serieses); }