//既にあるかの確認 public Boolean CanUse(InSet inSet) { inSet.CalcValue(); //同値の項を検索 InSet same = List_true_set.Find(x => x.pin.SequenceEqual(inSet.pin)); //無ければ追加 if (same == null) { return(true); } else { return(false); } }
//クワインマキラスキー計算 public void Calc() { Boolean keep = true; //計算継続の確認 List <InSet> List_culc_next = new List <InSet>(); //計算結果格納用リスト OutputDebug("計算中です。。。"); //パターンを導出 List_calc.Clear(); foreach (Pattern pattern in List_pattern) { if (pattern.OUT == 1) { InSet inSet = new InSet(input_count); for (int i = 0; i < input_count; i++) { inSet.pin[i] = pattern.Get_IN(i); } inSet.CalcValue(); List_value.Add(inSet.value); List_calc.Add(inSet); } } List_value = List_value.Distinct().ToList(); while (keep) { keep = false; List_culc_next = new List <InSet>(); for (int i = 0; i < List_calc.Count; i++) { for (int j = i + 1; j < List_calc.Count; j++) { //比較して合成可能だったら if (Comparison(List_calc[i], List_calc[j])) { //合成結果を格納用リストに格納 InSet merge = Merge(List_calc[i], List_calc[j]); merge.List_value = List_calc[i].List_value; merge.List_value.AddRange(List_calc[j].List_value); merge.List_value = merge.List_value.Distinct().ToList(); merge.CalcValue(); List_culc_next.Add(merge); List_calc[i].used = true; List_calc[j].used = true; keep = true; } } } //どれとも合成されなかった要素の継承 for (int i = 0; i < List_calc.Count; i++) { if (List_calc[i].used == false) { List_culc_next.Add(List_calc[i]); } } List_calc = List_culc_next; List_calc = DeleteSame(); string str = ""; foreach (InSet inSet in List_calc) { str += inSet.ToString() + " | "; } OutputDebug(str); } //不要項の整理 CleanSet(); DisplayAns(); OutputDebug("計算完了"); }