Listing permutations of different combination of characters

后端 未结 2 1157
孤独总比滥情好
孤独总比滥情好 2021-01-29 12:49

The closest SO topic I found is here: Listing all permutations of a string/integer

But how would I make use of this for different sets of characters for each position in

相关标签:
2条回答
  • 2021-01-29 13:20

    Use this code:

    public static List<string> GenerateCombinations(char[][] characters)
    {
        var combinations = new List<string>();
        GenerateCombinations(0, characters, new char[characters.GetLength(0)], combinations);
        return combinations;
    }
    
    private static void GenerateCombinations(int level, char[][] characters, char[] current, List<string> combinations)
    {
        if (level == characters.GetLength(0))
        {
            combinations.Add(new string(current));
            return;
        }
    
        foreach (var character in characters[level])
        {
            current[level] = character;
            GenerateCombinations(level + 1, characters, current, combinations);
        }
    }
    

    Example of using it:

    public static void Main()
    {
        var characters = new[]
                         {
                             new[] { 'a', 'b' },
                             new[] { 'a', 'b' },
                             new[] { '1', '2' }
                         };
    
        var combinations = GenerateCombinations(characters);
        foreach (var combination in combinations)
        {
            Console.WriteLine(combination);
        }
    }
    

    Output:

    aa1
    aa2
    ab1
    ab2
    ba1
    ba2
    bb1
    bb2
    
    0 讨论(0)
  • 2021-01-29 13:45

    If the length is fixed you could use this simple query which creates a cartesian product:

    string chars = "ab";
    int[] digits = { 1, 2 };
    var query = from c1 in chars 
                from c2 in chars 
                from d1 in digits 
                select string.Format("{0}{1}{2}", c1, c2, d1);
    string[] possibleCombinations = query.ToArray();
    

    Result:

    aa1
    aa2
    ab1
    ab2
    ba1
    ba2
    bb1
    bb2
    

    Edit: For what it's worth, lambda as requested(query syntax is much more readable):

    possibleCombinations = chars
        .SelectMany(c1 => chars
            .SelectMany(c2 => digits
                .Select(d1 => string.Format("{0}{1}{2}", c1, c2, d1))))
        .ToArray();
    

    If you need an approach which handles a dynamic length you could have a look at this:

    Dynamic Generation of All Possible Combinations of Index of an Array

    0 讨论(0)
提交回复
热议问题