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 + ba < 3b < 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(该层之前的层又有两个图像)

这个数组的第一个元素是所有层的所有图像数量的乘积,因此是组合的数量。

我们设置了一个将产生所有组合的循环。我们从每一层取一张图像。每层内的指数可以通过除以下一个因子,然后对层的图像数量进行模除来计算。

在线演示:https://dotnetfiddle.net/jhk18u