C#:从二维数组创建唯一的一维数组

C# : creating unique one-dimensional arrays from two-dimensional arrays

输入数据

1 -> [2] 
2 -> [3, 5, 7, 9]
3 -> [4]
4 -> [5]
5 -> [6]
6 -> [7, 9]
7 -> [8]
8 -> [9]
tree child

如何使用上面的数据得到如下所示的输出 一些 for 循环检查,但我做不到。我想要类似组合但无限的东西

输出数据

1,2,3,4,5,6,7,8,9

1,2,3,4,5,6,9

1,2,5,6,7,8,9

1,2,5,6,9

1,2,7,8,9

1,2,9

注意:此解决方案适用于 .Net 6 及更高版本。 (它也可以在 .Net 4.7.2 中工作,但不能在提供的 fiddle 中工作。)


假设您的输入树不是太大,您可以使用递归来实现您想要做的事情。

假设您的输入数据填充在 Dictionary 中,如下所示:

var input = new Dictionary<int, int[]>
{
    [1] = new[] { 2 },
    [2] = new[] { 3, 5, 7, 9 },
    [3] = new[] { 4 },
    [4] = new[] { 5 },
    [5] = new[] { 6 },
    [6] = new[] { 7, 9 },
    [7] = new[] { 8 },
    [8] = new[] { 9 }
};

var output = input.GetPossibleRanges();

然后您可以使用扩展方法递归地“构建”所有可能的树分支,例如:

public static IEnumerable<List<int>> GetPossibleRanges(this Dictionary<int, int[]> dict)
{
    var ranges = new List<int> { dict.Keys.Min() }.BuildRanges(dict);

    return ranges;
}

public static IEnumerable<List<int>> BuildRanges(this List<int> range, Dictionary<int, int[]> dict)
{
    if (dict.TryGetValue(range.Last(), out int[] nextLevel))
    {
        foreach (var child in nextLevel)
        {
            foreach (var grownRange in range.Append(child).ToList().BuildRanges(dict))
            {
                yield return grownRange;
            }
        }
    }
    else
    {
        yield return range;
    }
}

给定提供的输入,结果输出为:

foreach (var entry in output)
{
    Console.WriteLine(string.Join(",", entry));
}
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,9
1,2,5,6,7,8,9
1,2,5,6,9
1,2,7,8,9
1,2,9

我已经在 this fiddle 中实现了它。

public static IEnumerable GetPossibleRanges(this Dictionary dict) { var ranges = new List { dict.Keys.Min() }.BuildRanges(dict);

        return ranges;
    }

    public static IEnumerable<List<int>> BuildRanges(this List<int> range, Dictionary<int, int[]> dict) {
        if (dict.TryGetValue(range.Last(), out int[] nextLevel)) {
            foreach (var child in nextLevel) {
                range.Add(child);

                foreach (var grownRange in range.ToList().BuildRanges(dict)) {
                    yield return grownRange;
                }
            }
        } else {
            yield return range;
        }
    }

1,2,3,4,5,6,7,8,9 1,2,3,4,5,6,7,9 1,2,3,5,6,7,8,9 1,2,3,5,6,7,9 1,2,3,5,7,8,9 1,2,3,5,7,9

range.Append(child).ToList().BuildRanges(dict)

附加错误