In this blog, we will learn, how to get all the combination of the elements in an array.Suppose, we have an integer array "myarrint", as given below.
- int[] myarrint = new[] { 1, 2, 3 };
We need to get all the combination of elements in an array without repeating it. This will be 1,2,3,12,13,21,23,31,32,123,132,213,231,312,321.
Code:
- public int count = 0;
- protected void Page_Load(object sender, EventArgs e)
- {
- int[] myarrint = new[] { 1, 2, 3 };
- int[] responseint = Getdataint(myarrint);
- Response.Write(string.Join(",", responseint));
- }
-
- public int[] Getdataint(int[] arr)
- {
- count = arr.Length;
- return Combinationint(string.Join("", arr));
- }
-
- public int[] Combinationint(string str)
- {
- if (string.IsNullOrEmpty(str))
- throw new ArgumentException("Invalid input");
- if (str.Length == 1)
- return new int[] { Convert.ToInt32(str) };
- char c = str[str.Length - 1];
-
- string[] returnArray = Array.ConvertAll(Combinationint(str.Substring(0, str.Length - 1)), x => x.ToString());
- List<string> finalArray = new List<string>();
- foreach (string s in returnArray)
- finalArray.Add(s);
- finalArray.Add(c.ToString());
- int j = 0;
- foreach (string s in returnArray)
- {
- finalArray.Add(s + c);
-
- finalArray.Add(c + s);
- }
-
- #region sameelements
- returnArray = finalArray.ToArray();
- foreach (string s in returnArray)
- {
- if (str.Length == count)
- {
- if (s.Length < str.Length - 1)
- {
- foreach (char k in str)
- {
- foreach (char m in str)
- {
- if (k != m && !s.Contains(k) && !s.Contains(m))
- {
- finalArray.Add(s + k);
- finalArray.Add(s + m + k);
- finalArray.Add(m.ToString() + k.ToString());
- finalArray.Add(m + s + k);
- }
- }
- }
- }
- }
- j++;
- }
- #endregion
-
- int[] retarr = (Array.ConvertAll(finalArray.ToArray(), int.Parse)).Distinct().ToArray();
-
- Array.Sort(retarr);
- return retarr;
- }
The response is given below.
Same method can be applied on the string arrays also, with slight changes in the code.
- public int count = 0;
- protected void Page_Load(object sender, EventArgs e)
- {
- string[] myarr = new[] { "a", "b", "c" };
- string[] response = Getdata(myarr);
- Response.Write(string.Join(",", response));
- }
-
- public string[] Getdata(string[] arr)
- {
- count = arr.Length;
- return Combination(string.Join("", arr));
- }
-
- public string[] Combination(string str)
- {
- if (string.IsNullOrEmpty(str))
- throw new ArgumentException("Invalid input");
- if (str.Length == 1)
- return new string[] { str };
- char c = str[str.Length - 1];
-
- string[] returnArray = Combination(str.Substring(0, str.Length - 1));
- List<string> finalArray = new List<string>();
- foreach (string s in returnArray)
- finalArray.Add(s);
- finalArray.Add(c.ToString());
- int j = 0;
- foreach (string s in returnArray)
- {
- finalArray.Add(s + c);
-
- finalArray.Add(c + s);
- }
-
- #region sameelements
- returnArray = finalArray.ToArray();
- foreach (string s in returnArray)
- {
- if (str.Length == count)
- {
- if (s.Length < str.Length - 1)
- {
- foreach (char k in str)
- {
- foreach (char m in str)
- {
- if (k != m && !s.Contains(k) && !s.Contains(m))
- {
- finalArray.Add(s + k);
- finalArray.Add(s + m + k);
- finalArray.Add(m.ToString() + k.ToString());
- finalArray.Add(m + s + k);
- }
- }
- }
- }
- }
- j++;
- }
- #endregion
-
- Array.Sort(finalArray.ToArray());
- return finalArray.Distinct().ToArray();
- }
The response will is given below.
If we don't need same combination, i.e for 12 and 21, we just need 12 and we can comment out certain codes(marked in red) in the function.
- public int[] Combinationint(string str)
- {
- if (string.IsNullOrEmpty(str))
- throw new ArgumentException("Invalid input");
- if (str.Length == 1)
- return new int[] { Convert.ToInt32(str) };
- char c = str[str.Length - 1];
-
- string[] returnArray = Array.ConvertAll(Combinationint(str.Substring(0, str.Length - 1)), x => x.ToString());
- List<string> finalArray = new List<string>();
- foreach (string s in returnArray)
- finalArray.Add(s);
- finalArray.Add(c.ToString());
- int j = 0;
- foreach (string s in returnArray)
- {
- finalArray.Add(s + c);
-
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int[] retarr = (Array.ConvertAll(finalArray.ToArray(), int.Parse)).Distinct().ToArray();
-
- Array.Sort(retarr);
- return retarr;
- }
The output will be 1,2,3,12,13,23,123
Since this code is using recursion, the performance may be affected for very large arrays. Hope, this will be helpful for someone out there.