数组的布尔值的所有组合

时间:2016-04-21 16:13:27

标签: c# multidimensional-array boolean

我有一个字符串数组,可以是任意长度。如何生成一个布尔矩阵(布尔值数组的数组,其宽度与字符串数组相同),其中包含布尔值的所有组合?

结果看起来应该是这样的

0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
.
.
1 1 1 1

编辑: 为了详细说明,这是解决更大问题的一部分,以生成动态SQL来处理跨多个表的子句条件,每个表有2个版本。在我试图缩小这个问题时,我同意我可能过于简洁,我道歉。

这是我最后在JamJar00的帮助下完成的。

var sWhere = TranslateCriteriaToSQL(oUoW, oCriteria, false, false, DataBaseID, User);
var sResult = "";

var tables = asTables.ToArray();
int n = tables.Length;

List<bool[]> matrix = new List<bool[]>();
double count = Math.Pow(2, n);
for (int i = 0; i < count; i++)
{
     string str = Convert.ToString(i, 2).PadLeft(n, '0');
     bool[] boolArr = str.Select((x) => x == '1').ToArray();

     var sCondition = sWhere;
     for (var j = 0; j < boolArr.Length; j++)
     {
         if (boolArr[j])
         {
            sCondition = " OR (" + sCondition.Replace("[" + tables[j] + "]", "[" + tables[j] + "Pending" + "]") +
                         ")\n";
         }
     }
     sResult += sCondition;
}

}

4 个答案:

答案 0 :(得分:1)

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication87
{
    class Program 
    {
        static void Main(string[] args)
        {
            string input = "abcdef";
            long max = (long)(Math.Pow(2, input.Length) - 1);

            for (long count = 0; count <= max; count++)
            {
                List<string> array = new List<string>();
                for (int j = input.Length - 1; j >= 0; j--)
                {
                    array.Add((count >> j & 1) == 0 ? "0" : "1");
                }
                Console.WriteLine(string.Join(" ", array.ToArray()));
            }
            Console.ReadLine();

        }
    }
}

答案 1 :(得分:1)

你的问题不是最明确的,但我认为这与你之后的事情有关:

int n = 4;

List<bool[]> matrix = new List<bool[]>();
double count = Math.Pow(2, n);
for (int i = 0; i < count; i++)
{
    string str = Convert.ToString(i, 2).PadLeft(n, '0');
    bool[] boolArr = str.Select((x) => x == '1').ToArray();

    matrix.Add(boolArr);

    Console.WriteLine(String.Join(" ", boolArr.Select((x) => x ? "1" : "0")));
}

bool[][] arr = matrix.ToArray();

其中n是要创建的字符串的宽度。

(绝对不是我编写过的最优化代码......)

答案 2 :(得分:1)

使用输入字符串s和bool数组b

 string s = "foo";
 bool[,] b = new bool[(int)Math.Pow(2, s.Length), s.Length];
 for (int i = 0; i < (int)Math.Pow(2, s.Length); i++)
 {
     for (int j = 0; j < s.Length; j++)
     {
         b[i, s.Length - 1 - j] = ((i & (int)Math.Pow(2, j)) > 0);
     }
 }

答案 3 :(得分:0)

意识到这是一个古老的问题,但是我发现自己必须为布尔数组生成所有排列,并提出以下内容:

bool[][] GeneratePermutations(int size)
{
    return Enumerable.Range(0, (int)Math.Pow(2, size))
        .Select(i =>
            Enumerable.Range(0, size)
                .Select(b => ((i & (1 << b)) > 0))
                .ToArray()
        ).ToArray();
}