穷举一个数组的全部可能的组合

穷举一个数组的所有可能的组合
求大神解决问题
有一个字符串string str="a,c,d,b"
我要列出所有的组合
一位的有:a,b,c,d
2位的有:ab,ac,ad,bc,bd,cd
3位的有:abc,abd,acd,bcd
四位的有:abcd
我这个字符串str里边的字符数量不是固定的,有可能是“a,b,c”也有可能是“a,b,c,d,e”
求能适用于所有情况的算法
自己写了一个,如下,只能适用于str里边只有5组字符的。看有没启发

List<string> strlist = new List<string>();
            List<string> strs = "a,c,b,e,d".Split(',').OrderBy(t=>t).ToList();
            string temp = "";
            //5位
            for (int i = 0; i<strs.Count; i++)
            {
                temp += strs[i] + ",";
            }
            strlist.Add(temp);
            //4位数
            for (int i = 0; i < strs.Count - 3; i++)
            {
                for (int j = i + 1; j < strs.Count - 2; j++)
                {
                    for (int k = j + 1; k < strs.Count - 1; k++)
                    {
                        for (int n = k + 1; n < strs.Count; n++)
                        {
                            temp = strs[i] + "," + strs[j] + "," + strs[k] + "," + strs[n];
                            strlist.Add(temp);
                        }
                    }
                }
            }
            //3位数
            
                for (int j = 0; j < strs.Count - 2; j++)
                {
                    for (int k = j + 1; k < strs.Count - 1; k++)
                    {
                        for (int n = k + 1; n < strs.Count; n++)
                        {
                            temp = strs[j] + "," + strs[k] + "," + strs[n];
                            strlist.Add(temp);
                        }
                    }
                }
            //2位
                for (int k = 0; k < strs.Count - 1; k++)
                {