2016-04-21 4 views
-2

У меня есть массив строк, может быть любой длины. Как я могу создать логическую матрицу (массив массива логических значений с той же шириной, что и массив строк), который содержит все комбинации булевых элементов?Все комбинации булевых значений для массива

Результат должен выглядеть как этот

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

Edit: Выработать немного, это является частью решения более серьезной проблемой для создания динамического 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

Вы уверены, что вам нужно булево массив? Разве битмаски не хватит? – soon

+0

Любое представление будет работать. Также было бы нормально циклически перебирать все перестановки по одному, т. Е. Подпрограмму, которая просто дает следующую перестановку и какой-то показатель, если все будет хорошо, то есть мы закончили. – aggaton

+0

У вас есть 2^n возможных значений. Это может быть очень большой массив. –

ответ

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(); 

где п это ширина строк для создания.

(Определенно не самый оптимизированный код, который я когда-либо написал ...)

+0

Спасибо за это, похоже, делает то, что я искал, по какой-то причине я смотрел на себя слепо, не видя четко прямую прямое решение. – aggaton

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

С входной строки 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); 
    } 
} 
Смежные вопросы