【问题标题】:cannot convert type System.Collections.Generic.Icollection<int> to int无法将 System.Collections.Generic.Icollection<int> 类型转换为 int
【发布时间】:2017-07-19 19:22:07
【问题描述】:

我想使用四种基本面额 (1,5,10,25) 获得所有可能的方法来制作某个价格。我有以下代码。我知道它会在集合中生成结果,但我不知道如何在运行时提取整数。有人可以帮忙吗?

void CoinCalculator()
{
    //function that checks how many coins and of what denomation the player needs

    //get a copy of the purse contents
    priceChecker = ApplicationManager.am_keyPrice;  //hold key Price


    List<ICollection<int>> coins = new List<ICollection<int>> ();


    coins.Add(CoinChange1.GetCoinSets(priceChecker)[0]);


}

public class CoinChange1
{
    private int[] cs = new [] {25, 10, 5, 1};

    private List<ICollection<int>> solutions = new List<ICollection<int>> ();

    public static IList<ICollection<int>> GetCoinSets(int total) {
        // Handle corner case outside of recursive solution
        if (total == 0)
            return new List<ICollection<int>> ();

        // Get all possible sets
        CoinChange1 cc = new CoinChange1 ();
        cc.GetCoinSets (total, 0, new Stack<int>());
        return cc.solutions;
    }

    private void GetCoinSets(int n, int csi, Stack<int> combo) {
        // Find largest allowable coin (exploiting that cs is ordered descendingly)
        while (cs[csi] > n)
            csi++;
        int c = cs [csi];

        combo.Push (c); // Track coin selection
        if (n == c)
            solutions.Add(combo.ToArray()); // Base case
        else
            GetCoinSets (n - c, csi, combo); // Recursion 1: with a selected coin
        combo.Pop ();

        // Recurse for all other possibilities beyond this point with a combo of smaller coin units
        if(csi < (cs.Length - 1))
            GetCoinSets (n, csi + 1, combo);
    }
}

【问题讨论】:

  • 简单,不要使用 ICollection,因为它很烂。

标签: c# icollection


【解决方案1】:

您有一个集合列表,以便将它们输出到控制台,例如:

foreach(ICollection<int> coll in solutions)(
{
     foreach(int item in coll)
     {
          Console.WriteLine(item);
     }
}

因为您有集合列表,所以您必须迭代列表,并且对于列表中的每个项目,迭代集合以获取您的 int。

【讨论】:

  • 非常感谢!真的很感激。
【解决方案2】:

您可以迭代结果并“打印”它们或做任何您想做的事情。例如。

        var result = GetCoinSets(priceChecker );            
        // display result
        for (int i = 0; i < result.Count; i++) {
            string valuesSeparatedByComma = string.Join(", ", result[i]);

            Debug.WriteLine($"Combinaison #{i + 1}: {valuesSeparatedByComma}");
        }

如果您输入 15 会显示:

Combinaison #1: 5, 10
Combinaison #2: 1, 1, 1, 1, 1, 10
Combinaison #3: 5, 5, 5
Combinaison #4: 1, 1, 1, 1, 1, 5, 5
Combinaison #5: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5
Combinaison #6: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

【讨论】:

  • 感谢您的快速回复!我添加了以下行以传递给数组并且它起作用了... int[] coin = CoinChange1.GetCoinSets (priceChecker) [0].ToArray ();
  • 将 List 转换为 int (int[]) 数组确实很有用,它们都可以以相同的方式进行迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多