/// <summary> Annihilate </summary> public static MultiLinker <KeyValuePair <char, string> > Cancel(MultiLinker <KeyValuePair <char, string> > s) { if (!_prepare(s, Cancel)) { return(s); } bool mult = EqualsPorN(s.Link.Data.Data.Key, '*', '/'); double sum = mult ? 1d : 0d, n = 0d; foreach (var pair in s) { var p = pair.Data; if (IsNum(p.Data.Value)) { //try { var num = ToNum(p.Data.Value); if (num.Equals(0d) && mult) { return(s.Clone(new KeyValuePair <char, string>(s.Data.Key, num.ToString(CultureInfo.InvariantCulture)), null)); } switch (p.Data.Key) { case '+': sum += num; break; case '-': sum -= num; break; case '*': sum *= num; break; case '/': sum /= num; break; } s.Remove(pair); } else { //catch { var c = (char)(mult ? (p.Data.Key ^ '*' ^ '/') : (p.Data.Key ^ '+' ^ '-')); if (pair.Remove(mono => mono != null && mono.Data != null && (mono.Data.Data.Key == c && EqualsByValue(mono.Data, p) /* || * mono.Data.Data.Key == p.Data.Key && EqualsByValue(mono.Data, p)*/))) { s.Remove(pair); continue; } /* * if(pair.Data.Link == null) * { * var temp = s.Link.Find(mono => mono != null && mono.Data != null && * mono.Data.Count > 1 && * IsNum(mono.Data.Link.Data.Data.Value) && * EqualsByValue(mono.Data.Link.Link.Data.Data.Value, p.Value)); * if(false) * s.Remove(pair); * } * //*/ // if (EqualsPorN(p.Data.Key, '+', '-') && (p.Data.Value == @"n" || (p.Link != null && p.Link.Link != null && p.Link.Link.Link == null && IsNum(p.Link.Data.Data.Value) && p.Link.Link.Data.Data.Value == @"n"))) { n += (p.Data.Key == '-' ? -1d : 1d) * (p.Data.Value == @"n" ? 1d : double.Parse(p.Link.Data.Data.Value)); s.Remove(pair); } //*/ } } if (s.Link == null) { return(s.Clone(new KeyValuePair <char, string>(s.Data.Key, sum.ToString(CultureInfo.InvariantCulture)), null)); } if (mult) { if (!sum.Equals(1d)) { s.AddFirst(new KeyValuePair <char, string>(/*sum < 1d ? '/' :*/ '*', (/*sum < 1d ? 1d / sum : */ sum).ToString(CultureInfo.InvariantCulture))); } } if (!n.Equals(0d)) { string abs = System.Math.Abs(n).ToString(CultureInfo.InvariantCulture); var c = s.Clone(new KeyValuePair <char, string>(n < 0d ? '-' : '+', abs + @"*n"), null); c.Add(new KeyValuePair <char, string>('*', abs)); c.Add(new KeyValuePair <char, string>('*', @"n")); s.Add(c); } if (!mult) { //else { if (!sum.Equals(0d)) { s.Add(new KeyValuePair <char, string>(sum < 0d ? '-' : '+', System.Math.Abs(sum).ToString(CultureInfo.InvariantCulture))); } } return(s); }
public static MultiLinker <KeyValuePair <char, string> > CommonMultiplier(IEnumerable <MultiLinker <KeyValuePair <char, string> > > ss) { MultiLinker <KeyValuePair <char, string> > r = ArithmeticGraph(One), t; if (ss == null) { return(r); } var e = ss.GetEnumerator(); if (!e.MoveNext() || e.Current == null) { return(r); } bool minus = false; if (EqualsPorN(e.Current.Data.Key, '*', '/')) { r.Add(e.Current); } else { minus = e.Current.Data.Key == '-'; if (e.Current.Link != null && EqualsPorN(e.Current.Link.Data.Data.Key, '*', '/')) { foreach (var mono in e.Current) { r.Add(mono.Data); } } else { r.Add(e.Current.Clone(new KeyValuePair <char, string>('*', e.Current.Data.Value), e.Current.Link)); } } while (e.MoveNext()) { t = ArithmeticGraph(One); if (e.Current == null) { return(t); } minus &= e.Current.Data.Key == '-'; if (EqualsPorN(e.Current.Data.Key, '*', '/')) { t.Add(e.Current); } else { if (e.Current.Link != null && EqualsPorN(e.Current.Link.Data.Data.Key, '*', '/')) { foreach (var mono in e.Current) { t.Add(mono.Data); } } else { t.Add(e.Current.Clone(new KeyValuePair <char, string>('*', e.Current.Data.Value), e.Current.Link)); } } foreach (var pair in r) { var copy = pair.Data; if (!t.Remove(mono => mono != null && (mono.Data.Data.Key == copy.Data.Key && EqualsByValue(mono.Data, copy)))) { r.Remove(pair); } else if (t.Link == null) { pair.Link = null; } } } return(minus ? ChangeSign(r, '+', '-') : r); }