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)
附加错误
输入数据
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
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)
附加错误