public override bool MoveNext() { if (MoveNextSublocality()) { return(true); } if (!base.MoveNext()) { return(false); } ExceptFor = null; ExceptForKana = null; if (!string.IsNullOrEmpty(Locality) && !string.IsNullOrEmpty(LocalityKana)) { var cm = _Paren.Match(Locality); var km = _ParenKana.Match(LocalityKana); if (cm.Success && km.Success) { var cem = _ExceptFor.Match(Locality); var kem = _ExceptForKana.Match(LocalityKana); if (cem.Success && kem.Success) { ExceptFor = Locality.Substring(cm.Index + 1, Locality.Length - 5 - cm.Index); ExceptForKana = LocalityKana.Substring(km.Index + 1, LocalityKana.Length - 7 - km.Index); } else { var cv = cm.Groups[1].Value; var kv = km.Groups[1].Value; var cs = _Split.Split(cv); var ks = _SplitKana.Split(kv); IEnumerable <SublocalityEntry> raws; if (cs.Length == ks.Length) { raws = Enumerable.Range(0, cs.Length).Select(i => new SublocalityEntry(cs[i], ks[i])); } else { raws = new[] { new SublocalityEntry(cv, kv) }; } _SublocalityIndex = 0; _Sublocalities = raws.SelectMany(e => e.Populate()).ToList(); MoveNextSublocality(); } Locality = Locality.Substring(0, cm.Index); LocalityKana = LocalityKana.Substring(0, km.Index); } } return(true); }