【问题标题】:C#获取所有可能的组合
【发布时间】:2022-01-23 14:37:12
【问题描述】:

我在一个类中有一个自定义类列表

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&lt;Layer&gt; Layers = new List&lt;Layer&gt;();

  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;

它应该从图层列表中的每一层获取 1 张图像并返回一个图像列表。我找不到任何解决方案来获得所有组合。你能帮帮我吗?

What I am aiming for as an image

【问题讨论】:

  • 想要什么?你能给出一个带有预期输出的示例输入吗?每层可以有多个图像,但您只需要一个图像。你想要哪一个?组合是什么意思?
  • @Hebele Hübele 是否要从 Form 对象内的 Layer 列表中获取数组中的图像列表?
  • 我编辑了这个问题,也许你能更好地理解它。
  • 你只需要两个 for 循环?

标签: c# loops for-loop foreach combinations


【解决方案1】:

你可以用这个方法来实现你想要的:

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;
    }
}

在第一步中,我们填充一个称为因子的数组。数组的最后一个元素将是 1。然后从后面填充数组。每个元素是后面的元素和具有相同索引的图层的图像数量的乘积。例如,如果我们有 2、2 和 3 张图像的三层,则元素将从后面:

  • 1(固定为最后一个元素)
  • 3*1 = 3(最后一层有三张图片)
  • 2*3 = 6(最后一层之前的层有两张图片)
  • 2*6 = 12(该层之前的层又有两张图片)

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

我们设置了一个循环来生成所有组合。我们从每一层拍摄一张图像。每层内的索引可以通过下一个因子除以该层的图像数量进行模除来计算。

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

【讨论】:

    【解决方案2】:

    @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)
                }
            }
    

    【讨论】:

    • 好的,但我不想要这个。我放了一张图片,以便您更好地理解它。对不起,我英语不好
    猜你喜欢
    • 2013-10-06
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多