我有一个字符串数组,可以是任意长度。如何生成一个布尔矩阵(布尔值数组的数组,其宽度与字符串数组相同),其中包含布尔值的所有组合?
结果看起来应该是这样的
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;
}
}
答案 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();
}