我正在尝试找到一种允许我执行以下操作的算法: 想象一下,我有10个布尔变量,我想尝试每一个组合,因为我的目标是找到任何组合,这将给我的一个方法的结果是真的(这个方法有很多限制,这就是为什么我要测试每种可能的组合,如果没有可以解决问题的组合,那么我想通知用户这个)。 我希望这是可以理解的!
答案 0 :(得分:7)
试试这个:
for (int i = 0; i < (1 << 10); i++)
{
bool b1 = (i & (1 << 0)) != 0;
bool b2 = (i & (1 << 1)) != 0;
bool b3 = (i & (1 << 2)) != 0;
bool b4 = (i & (1 << 3)) != 0;
...
if (MyMethod(b1, b2, b3, b4, ...))
{
// Found a combination for which MyMethod returns true
}
}
当然,您也可以使用LINQ:
var result = from b1 in new[] { false, true }
from b2 in new[] { false, true }
from b3 in new[] { false, true }
from b4 in new[] { false, true }
...
where MyMethod(b1, b2, b3, b4, ...)
select new { b1, b2, b3, b4, ... };
答案 1 :(得分:1)
我终于提出了一种更有效的方法:使用二进制数: 假设我想测试8个变量中所有可能的布尔组合: 如果我选择执行以下操作,我将测试每个组合:
public string CombinationFinder()
{
for (int i = 0; i < 2 ^ 8; i++)
{
String ans = Convert.ToInt32(i, 2).ToString();
if (myMethod(ans))
{
return ans;
}
}
return null;
}
这将从0到255,二进制表示从00000000到11111111 其中每个数字取值0或1,可以表示为布尔值。在此示例中,如果找不到任何组合,则该方法将返回null。
答案 2 :(得分:0)
定义一个这样的类:
class Bint
{
int num;
public bool this[int num]
{
get {return num << n & 0x1 == 1;}
}
public int Num
{
get {return num;}
set {num = value;}
}
}
并遍历数字:
Bint n = new Bint();
for (int i = 0; i < Math.pow(2,10); i++)
{
n.Num = i;
f(n[0],n[1]...);
}
答案 3 :(得分:0)
我知道这是一个老问题,但是waclock的答案没有编译(C#中没有指数运算符)。 dtb的答案得到了99%的答案,但没有处理未知数量的布尔值,这就是答案所提供的:
var props = typeof(TypeWithBooleans).GetProperties().Where(prop => prop.PropertyType == typeof(bool)).ToArray();
for (var i = 0; i < (1 << props.Length); ++i)
{
var combination = Enumerable.Range(0, props.Length).Select(j => (i & (1 << j)) != 0).ToArray();
if (MyMethod(combination)) {
// handle match
};
}
这假设您关注的所有布尔值都限制在单个类/结构中,并且MyMethod
使用了一个参数数组。