/// <summary> /// クローンを作成します。 /// </summary> /// <returns></returns> public SySet <T1> Clone() { SySet <T1> clone = new SySet_Ordered <T1>(this.word); // 要素をコピーします。 foreach (T1 element in this.elements_) { clone.AddElement(element); } // 親集合のクローンをコピーします。 foreach (SySet <T1> superset in this.supersets_) { clone.AddSupersets(superset.Clone()); } return(clone); }
public static List <List <string> > Load(string path) { List <List <string> > rows = Util_Csv.ReadCsv(path); // 最初の1行は削除。 rows.RemoveRange(0, 1); Michi187Array.Items.Clear(); // 構文解析は大雑把です。 // (1)空セルは無視します。 // (2)「@DEFINE」セルが処理開始の合図です。 // (3)次のセルには集合の名前です。「味方陣」「平野部」「敵陣」のいずれかです。 // (4)次のセルは「=」です。 // (5)次のセルは「{」です。 // (6)次に「}」セルが出てくるまで、符号のセルが連続します。「1九」「1八」など。 // (7)「}」セルで、@DEFINEの処理は終了です。 foreach (List <string> row in rows) { // 2列目は、道名。 SySet <SyElement> michi187 = new SySet_Ordered <SyElement>(row[1].Trim()); SySet <SyElement> michiPart = null; // 各行の先頭1列目(連番)と2列目(道名)は削除。 row.RemoveRange(0, 2); bool isPart_Define = false; //@DEFINEパート bool isPart_Define_Member = false; //符号パート foreach (string cell1 in row) { string cell = cell1.Trim(); if (cell == "") { goto gt_Next1; } if (isPart_Define) { if (cell == "=") { goto gt_Next1; } if (cell == "{") { isPart_Define_Member = true; goto gt_Next1; } if (cell == "}") { isPart_Define_Member = false; isPart_Define = false; goto gt_Next1; } if (isPart_Define_Member) { // 「1一」を「1」に変換します。 SyElement masu81 = Util_Masu.kanjiToEnum[cell]; michiPart.AddElement(masu81); } else { switch (cell) { case "味方陣": michiPart = new SySet_Ordered <SyElement>("味方陣"); michi187.AddSupersets(michiPart); goto gt_Next1; case "平野部": michiPart = new SySet_Ordered <SyElement>("平野部"); michi187.AddSupersets(michiPart); goto gt_Next1; case "敵陣": michiPart = new SySet_Ordered <SyElement>("敵陣"); michi187.AddSupersets(michiPart); goto gt_Next1; default: throw new Exception($"未定義のキーワードです。[{cell}]"); } } } else { if (cell == "@DEFINE") { isPart_Define = true; goto gt_Next1; } } gt_Next1: ; } Michi187Array.Items.Add(michi187); } return(rows); }