public override bool Evaluate(Record r, SubRecord sr) { if (this.Type == BatchCondRecordType.Create) { if (sr == null) { // guess the best insert location int idx = -1; var records = r.GetStructures(); RecordStructure rs; if (records.TryGetValue(r.Name, out rs)) { for (int i = Array.FindIndex(rs.subrecords, structure => structure.name == this.Record.name) - 1; i >= 0; --i) { var srsname = rs.subrecords[i].name; idx = r.SubRecords.IndexOf(r.SubRecords.FirstOrDefault(x => x.Name == srsname)); } } sr = new SubRecord(this.Record); if (idx < 0) { r.SubRecords.Add(sr); } else { r.SubRecords.Insert(idx + 1, sr); } } } else if (this.Type == BatchCondRecordType.Delete) { while (sr != null) { r.SubRecords.Remove(sr); sr = r.SubRecords.FirstOrDefault(x => x.Name == this.Record.name); } } return(true); }
public override bool Evaluate(Record r, SubRecord sr) { if (this.Type == BatchCondRecordType.Create) { if (sr == null) { // guess the best insert location int idx = -1; var records = r.GetStructures(); RecordStructure rs; if (records.TryGetValue(r.Name, out rs)) { for (int i = Array.FindIndex(rs.subrecords, structure => structure.name == this.Record.name) - 1; i >= 0; --i) { var srsname = rs.subrecords[i].name; idx = r.SubRecords.IndexOf(r.SubRecords.FirstOrDefault(x => x.Name == srsname)); } } sr = new SubRecord(this.Record); if (idx < 0) { r.SubRecords.Add(sr); } else { r.SubRecords.Insert(idx + 1, sr); } } } else if (this.Type == BatchCondRecordType.Delete) { while (sr != null) { r.SubRecords.Remove(sr); sr = r.SubRecords.FirstOrDefault(x => x.Name == this.Record.name); } } return true; }
public static void ReorderSubrecords(Record rec) { var records = rec.GetStructures(); if (rec == null || records == null) return; RecordStructure recStruct; if (!records.TryGetValue(rec.Name, out recStruct)) return; SubrecordStructure[] sss = recStruct.subrecords; var subs = new List<SubRecord>(rec.SubRecords); foreach (var sub in subs) { sub.DetachStructure(); } var newsubs = new List<SubRecord>(); for (int ssidx = 0, sslen = 0; ssidx < sss.Length; ssidx += sslen) { SubrecordStructure ss = sss[ssidx]; bool repeat = ss.repeat > 0; sslen = Math.Max(1, ss.repeat); bool found = false; do { found = false; for (int ssoff = 0; ssoff < sslen; ++ssoff) { ss = sss[ssidx + ssoff]; for (int i = 0; i < subs.Count; ++i) { var sr = subs[i]; if (sr.Name == ss.name) { newsubs.Add(sr); subs.RemoveAt(i); found = true; break; } } } } while (found && repeat); } newsubs.AddRange(subs); rec.SubRecords.Clear(); rec.SubRecords.AddRange(newsubs); }