我如何编制这个列表的程序化?我需要所有的组合
string[] list = { "Open", "Completed","Rescheduled", "Canceled", "Started",
"Customer notified", "Do Not Move", "Needs Confirmation" };
此列表是第15个有200多种组合。
答案 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位标志,你可能会觉得有帮助。