C# 测试字符串中的所有可能性

C# 测试字符串中的所有可能性,c#,string,linq,c#-4.0,C#,String,Linq,C# 4.0,我试图测试(与内存中的另一个值进行比较)字符串中所有可能的组合,但想知道最好的方法是什么 我的输入字符串是0246,诀窍是每个数字可以是两个选项之一,例如: [0,1][2,3][4,5][6,7] 我希望能够翻转所有可能的组合,这有点像打开保险箱,但这不是目的,我保证 我想做一个foreach循环来切换每个选项,但是我的循环是嵌套的,我知道性能会受到影响,因为Linq就像新的黑色一样,可以使用它吗 更新* 我希望结果按从低到高的顺序返回,因为我要比较的原始字符串可能是0001,但随机跳转没有

我试图测试(与内存中的另一个值进行比较)字符串中所有可能的组合,但想知道最好的方法是什么

我的输入字符串是
0246
,诀窍是每个数字可以是两个选项之一,例如:

[0,1][2,3][4,5][6,7]
我希望能够翻转所有可能的组合,这有点像打开保险箱,但这不是目的,我保证


我想做一个
foreach
循环来切换每个选项,但是我的循环是嵌套的,我知道性能会受到影响,因为Linq就像新的黑色一样,可以使用它吗

更新*

我希望结果按从低到高的顺序返回,因为我要比较的原始字符串可能是0001,但随机跳转没有意义

我还想记录有多少次我不得不生成一个不同的变体,并记下,因为它将在以后使用

你是说:

var allCombinations = from a in new[] { "0", "1", }
                      from b in new[] { "2", "3", }
                      from c in new[] { "4", "5", }
                      from d in new[] { "6", "7", }
                      select a + b + c + d;
或者更夸张地说:

var allCombinations = from a in "01"
                      from b in "23"
                      from c in "45"
                      from d in "67"
                      select string.Concat(a, b, c, d);

在后一个(奇特的)版本中,
a
b
c
d
char
变量和
string。Concat(a,b,c,d)
也可以写入
a.ToString()+b+c+d
要测试您的im内存中的值,您不需要生成所有可能的值。生成完整字符串并比较它是执行此任务的最糟糕方法

如果要控制比较过程(计数操作),则不能使用任何内置方法(正则表达式或
Linq
)。您应该手动检查字符串中的所有字符并进行检查

public bool Test(string input, string[] possibleValues)
{
    int operationsCount = 0;
    if (input.Length != possibleValues.Length)
    {
        return false;
    }

    for (int i = 0; i < input.Length; i++)
    {
        bool found = false;
        for (int j = 0; j < possibleValues[i].Length; j++)
        {
            operationsCount++;
            if (input[i] == possibleValues[i][j])
            {
                found = true;
                break;
            }
        }
        if (!found)
        {
            Console.WriteLine("Value does not satisfies the condition. Number of operations: " + operationsCount);
            return false;
        }
    }
    Console.WriteLine("Value satisfies the condition. Number of operations: " + operationsCount);
    return true;
}

Test("0247", new string[] { "01", "23", "45", "67" });

以下是一种适用于任意数量输入的方法(在将格式解析为
int[][]]
之后),使用和:

产出:

0246 
0247 
0256 
0257 
0346 
0347 
0356 
0357 
1246 
1247 
1256 
1257 
1346 
1347 
1356 
1357 
它使用LINQ,所以它可能不是有史以来最快的东西(对于我来说,这个数据仍然<1毫秒),而且我如何使用固定连接值的
Join
,这可能不是有史以来最好的东西,但嘿,它工作得很好


我假设你需要列出所有的值。如果您真正想做的只是查看值是否与看起来像是有效密码的内容匹配,那么像regex的可能就是最好的选择。

我不是c#程序员,但这似乎是regex的理想人选:/^[01][23][45][67]$/“我知道性能会受到影响”-因此,您希望LINQ版本为/
foreach
生成与嵌套的
相同数量的组合,但具有更好的性能???@AlexeiLevenkov措词不当,但我认为他的意思是使用LINQ会降低性能(很可能会).由于每个按钮可能是两个数字中的一个,您是想找出数字组合还是按钮组合?您说“测试可能性”,然后说您想生成所有组合。它是哪一种?(修订)我想它可以做任何一种方式。OP说“test for”,但随后提到了LINQ和可能性。这个问题也让我困惑,但我认为目的是检查输入字符串。所以目标之一是确定我在组合中循环的次数,并记下该值,这种方法提供了吗?我将用这些附加信息更新我的问题。还有,所谓“测试”是指与我记忆中的另一个值进行比较。我很笨。我可以使用foreach循环来确定计数。我希望今晚能对此进行测试,并向大家报告,谢谢。我喜欢这种方法,因为它按照从低到高的顺序进行,因为我将要比较的目标值(测试)可以是任何一个,所以跳来跳去产生不同的变化是没有意义的。我希望今晚能够测试这个,并且会报告说如果你总是有4个位置/数字,这是很好的。否则,像我这样更一般的解决方案更好。
var data = new[]
{
    new[] { 0, 1 },
    new[] { 2, 3 },
    new[] { 4, 5 },
    new[] { 6, 7 },
};
var nums = data.Aggregate(new[] { "" }.AsEnumerable(),
        (agg, arr) => agg.Join(arr, x => 1, x => 1, (i, j) => i.ToString() + j));
0246 
0247 
0256 
0257 
0346 
0347 
0356 
0357 
1246 
1247 
1256 
1257 
1346 
1347 
1356 
1357