public List <List <string> > Generate() { if (variables.Count == 0) { ExpressionStack stack = new ExpressionStack(); foreach (var token in expression) { stack.Push(token); } return(new List <List <string> > { new List <string>() { stack.ForceEval().Result.ToString() } }); } List <List <string> > ret = new List <List <string> >(); // ret.Add(variables.Select(var => var).Prepend("№").ToList()); //DEEP COPY for (int i = 0; i < 2 << (variables.Count - 1); i++) { Dictionary <string, bool> varibaleValues = new Dictionary <string, bool>(); List <string> row = new List <string> { i.ToString() }; foreach (var(variable, j) in variables.Select((variable, j) => (variable, j))) { varibaleValues[variable] = Convert.ToBoolean((i >> (variables.Count - 1 - j)) & 1); row.Add(varibaleValues[variable].ToString()); } ExpressionStack stack = new ExpressionStack(varibaleValues); stack.OnEval = (ExprResult result) => { if (i == 0) { ret[0].Add(result.Expression); } row.Add(result.Result.ToString()); }; foreach (var token in expression) { stack.Push(token); } stack.ForceEval(); ret.Add(row); } return(ret); }