根据数组

时间:2015-07-14 16:21:08

标签: c# arrays list

我如何编制这个列表的程序化?我需要所有的组合

string[] list = { "Open", "Completed","Rescheduled", "Canceled", "Started",
    "Customer notified", "Do Not Move", "Needs Confirmation" };

此列表是第15个有200多种组合。

  1. 打开
  2. 已完成
  3. 打开,完成
  4. 重整
  5. 开放,重新安排
  6. 已完成,已重新安排
  7. 打开,完成,重新安排
  8. 取消
  9. 打开,取消
  10. 已取消已取消
  11. 打开,完成,取消
  12. 已重新安排,已取消
  13. 打开,已重新安排,已取消
  14. 已完成,已重新安排,已取消
  15. 打开,完成,重新安排,取消

1 个答案:

答案 0 :(得分:1)

这是一种使用字符串可视化它的方法。数组中的每个点可以被认为是二进制数中的位(0或1)。如果所有位都打开,则会为您提供最大组合数。因此,您从1到最大数字进行迭代,并包含以该数字的二进制形式切换的数组中的值:

    private void button1_Click(object sender, EventArgs e)
    {
        string[] list = { "Open", "Completed","Rescheduled", 
                            "Canceled", "Started", "Customer notified", 
                            "Do Not Move", "Needs Confirmation" };

        string binary;
        int max = (int)Math.Pow(2, list.Length);
        List<string> combo = new List<string>();
        List<string> combinations = new List<string>();

        for(int i = 1; i < max; i++)
        {
            binary = Convert.ToString(i, 2); ' convert it to a binary number as a string
            char[] bits = binary.ToCharArray();
            Array.Reverse(bits);
            binary = new string(bits);

            combo.Clear();
            for(int x = 0; x < binary.Length; x++)
            {
                if (binary[x] == '1')
                {
                    combo.Add(list[x]);
                }
            }
            combinations.Add(String.Join(", ", combo));
        }

        // ... do something with "combinations" ...
        listBox1.DataSource = null;
        listBox1.DataSource = combinations;
    }

*编辑*

这里的内容相同,但使用标有enum属性的Flags的rbks方法。这是我上面做的,但没有字符串操作;它只是在引擎盖下使用直接数学和位操作。请注意,每个州的值是2的幂,而在它们前面有0x。另请注意,您不能在值中包含空格,因此我使用了下划线,然后在字符串版本输出中替换它们:

    [Flags]
    public enum Status
    {
        Open = 1,
        Completed = 2,
        Rescheduled = 4,
        Canceled = 8,
        Started = 16,
        Customer_Notified = 32,
        Do_Not_Move = 64,
        Needs_Confirmation = 128
    }

    private void button2_Click(object sender, EventArgs e)
    {
        List<string> combinations = new List<string>();

        Status status;
        int max = (int)Math.Pow(2, Enum.GetValues(typeof(Status)).Length);
        for(int i = 1; i < max; i++)
        {
            status = (Status)i;
            combinations.Add(status.ToString().Replace("_", " "));
        }

        listBox1.DataSource = null;
        listBox1.DataSource = combinations;
    }

这里有一个article位标志,你可能会觉得有帮助。