Not sure if this is the best solution, but it works. You can try and optimize it.
public class CombInput { public int ID; public string Value; } public List<string> GetCombinations(List<string> values) { List<CombInput> input = new List<CombInput>(); List<string> outputvalues = new List<string>(); int counter = 1; foreach (String c in values) { input.Add(new CombInput { ID = counter, Value = c }); counter++; } var Output = from i in input select i; string Final = Output.Select(query => query.Value).Aggregate((a, b) => a + "|" + b); while (!Output.ToList().Exists(s=>s.Value.ToString()==Final)) { var store = Output; var Output1= (from o in Output from v in input where (v.ID < o.ID && !(store.Any(a=>a.Value==v.Value + "|" + o.Value))) select new CombInput { ID = v.ID, Value = v.Value + "|" + o.Value }); var Outputx = (from s in store select s) .Concat (from s in Output1.ToList() select s); Output = Outputx; } foreach (var v in Output) outputvalues.Add(v.Value); return outputvalues.ToList(); } public List<string> GetProductCombinations(List<int> nums, int productCriteria) { List<string> input = (from i in nums select i.ToString()).ToList(); input = GetCombinations(input); var O = from i in input where i.Split('|').ToList().Select(x => Convert.ToInt32(x)).ToList().Aggregate((a, b) => a * b) == productCriteria select i; List<string> output=new List<string>(); foreach (string o in O) { output.Add(o); } return output; } private void button1_Click(object sender, EventArgs e) { List<string> output = new List<string>(); List<int> nums = new List<int>(); int[] numsarr ={1,2,3,4,6,7,8,12}; nums = numsarr.ToList(); output = GetProductCombinations(nums, 12); }
source share