C# 获取所有可能的组合
C# get all possible combinations
我在 class
中有一个自定义列表 Class
public class CustomImage
{
public CustomImage(Image image,string Hash)
{
this.Image = image;
this.HashCode = Hash;
}
public Image Image { get; set; }
public string HashCode { get; set; }
}
public class Layer
{
public List<CustomImage> Images { get; set; }
public Layer(string folderPath)
{
//....
}
public string HashCode { get; set; }
//....
}
在我的表格中我有: public List<Layer> Layers = new List<Layer>();
private Image[] Test()
{
Image First = Layers[0].Images[0].Image;
Image Second = Layers[1].Images[0].Image;
Image Third = Layers[2].Images[0].Image;
return new Image[] { First, Second, Third };
}
及之后:Image Third = Layers[2].Images[1].Image;
及之后:Image Third = Layers[2].Images[2].Image;
当第三个图像循环全部完成后,它将开始执行第二个图像循环。
Image Second = Layers[1].Images[1].Image; Image Third = Layers[2].Images[0].Image;
Image Second = Layers[1].Images[1].Image; Image Third = Layers[2].Images[1].Image;
它应该从图层列表中的每个图层和 return 图像列表中获取 1 个图像。我找不到获得所有组合的任何解决方案。你能帮帮我吗?
What I am aiming for as an image
@Hebele Hübele,正如@Liam 所建议的。你需要两个 for 循环:
var imageArray = new Image[1];
//loop the layers
foreach (var layer in layers) {
//and for each layer loop images
foreach (var imgObject in layer.Images) {
imageArray.Append(imgObject.Image)
}
}
如果我们可以将这些组合排序,那么我们就可以使用循环来获取每个组合。如果每一层都有十张图像,那么这将非常容易。例如,对于 4 层,我们将得到 4 位数字。 5327 表示第一层的第 5 张图像、第 2 层的第 3 张图像、第 3 层的第 2 张图像、第 4 层的第 7 张图像。如果每一层都不是十个,而是相同数量的图像,这也很容易。我们只需要转到一个不同的数字系统。例如,如果每层有 16 张图像,你可以使用十六进制数。
但是你的情况比较复杂,因为每一层都可以有单独数量的图像。因此我们必须使用自定义数字系统,其中每个数字都使用自定义幂。例如,如果有两层,第一层有 3 个图像,第二层有 5 个图像,则有 15 种组合。我们可以将 0 到 14 的每个数字写成 a*5 + b
和 a < 3
和 b < 5
.
你可以用这个方法达到你想要的效果:
public static IEnumerable<CustomImage[]> GetCombinations(List<Layer> input)
{
int[] factors = new int[input.Count + 1];
factors[factors.Length - 1] = 1;
for(int i = factors.Length - 2; i >= 0; i--)
{
factors[i] = factors[i+1] * input[i].Images.Count;
}
int max = factors[0];
for(int j = 0; j < max; j++)
{
CustomImage[] result = new CustomImage[input.Count];
for(int i = 0; i < input.Count; i++)
{
result[i] = input[i].Images[j / factors[i+1] % input[i].Images.Count];
}
yield return result;
}
}
第一步,我们填充一个名为factors的数组。数组的最后一个元素将是 1。然后从后面填充数组。每个元素都是下一个元素与具有相同索引的层的图像数量的乘积。例如,如果我们有 2、2 和 3 个图像的三层,元素将从后面:
- 1(固定为最后一个元素)
- 3*1 = 3(最后一层有三张图片)
- 2*3 = 6(最后一层之前的图层有两张图片)
- 2*6 = 12(该层之前的层又有两个图像)
这个数组的第一个元素是所有层的所有图像数量的乘积,因此是组合的数量。
我们设置了一个将产生所有组合的循环。我们从每一层取一张图像。每层内的指数可以通过除以下一个因子,然后对层的图像数量进行模除来计算。
我在 class
中有一个自定义列表 Classpublic class CustomImage
{
public CustomImage(Image image,string Hash)
{
this.Image = image;
this.HashCode = Hash;
}
public Image Image { get; set; }
public string HashCode { get; set; }
}
public class Layer
{
public List<CustomImage> Images { get; set; }
public Layer(string folderPath)
{
//....
}
public string HashCode { get; set; }
//....
}
在我的表格中我有: public List<Layer> Layers = new List<Layer>();
private Image[] Test()
{
Image First = Layers[0].Images[0].Image;
Image Second = Layers[1].Images[0].Image;
Image Third = Layers[2].Images[0].Image;
return new Image[] { First, Second, Third };
}
及之后:Image Third = Layers[2].Images[1].Image;
及之后:Image Third = Layers[2].Images[2].Image;
当第三个图像循环全部完成后,它将开始执行第二个图像循环。
Image Second = Layers[1].Images[1].Image; Image Third = Layers[2].Images[0].Image;
Image Second = Layers[1].Images[1].Image; Image Third = Layers[2].Images[1].Image;
它应该从图层列表中的每个图层和 return 图像列表中获取 1 个图像。我找不到获得所有组合的任何解决方案。你能帮帮我吗?
What I am aiming for as an image
@Hebele Hübele,正如@Liam 所建议的。你需要两个 for 循环:
var imageArray = new Image[1];
//loop the layers
foreach (var layer in layers) {
//and for each layer loop images
foreach (var imgObject in layer.Images) {
imageArray.Append(imgObject.Image)
}
}
如果我们可以将这些组合排序,那么我们就可以使用循环来获取每个组合。如果每一层都有十张图像,那么这将非常容易。例如,对于 4 层,我们将得到 4 位数字。 5327 表示第一层的第 5 张图像、第 2 层的第 3 张图像、第 3 层的第 2 张图像、第 4 层的第 7 张图像。如果每一层都不是十个,而是相同数量的图像,这也很容易。我们只需要转到一个不同的数字系统。例如,如果每层有 16 张图像,你可以使用十六进制数。
但是你的情况比较复杂,因为每一层都可以有单独数量的图像。因此我们必须使用自定义数字系统,其中每个数字都使用自定义幂。例如,如果有两层,第一层有 3 个图像,第二层有 5 个图像,则有 15 种组合。我们可以将 0 到 14 的每个数字写成 a*5 + b
和 a < 3
和 b < 5
.
你可以用这个方法达到你想要的效果:
public static IEnumerable<CustomImage[]> GetCombinations(List<Layer> input)
{
int[] factors = new int[input.Count + 1];
factors[factors.Length - 1] = 1;
for(int i = factors.Length - 2; i >= 0; i--)
{
factors[i] = factors[i+1] * input[i].Images.Count;
}
int max = factors[0];
for(int j = 0; j < max; j++)
{
CustomImage[] result = new CustomImage[input.Count];
for(int i = 0; i < input.Count; i++)
{
result[i] = input[i].Images[j / factors[i+1] % input[i].Images.Count];
}
yield return result;
}
}
第一步,我们填充一个名为factors的数组。数组的最后一个元素将是 1。然后从后面填充数组。每个元素都是下一个元素与具有相同索引的层的图像数量的乘积。例如,如果我们有 2、2 和 3 个图像的三层,元素将从后面:
- 1(固定为最后一个元素)
- 3*1 = 3(最后一层有三张图片)
- 2*3 = 6(最后一层之前的图层有两张图片)
- 2*6 = 12(该层之前的层又有两个图像)
这个数组的第一个元素是所有层的所有图像数量的乘积,因此是组合的数量。
我们设置了一个将产生所有组合的循环。我们从每一层取一张图像。每层内的指数可以通过除以下一个因子,然后对层的图像数量进行模除来计算。