Я только начинаю изучать единство и видел эту задачу в одной из моих книг по изучению С#. Мне нужно создать код, используя оператор if внутри foreach, чтобы он проверял, могу ли я позволить себе каждый элемент в словаре, но я понятия не имею, как проверить их все или хотя бы один конкретный, поэтому я мог бы написать, если 3 раза Например.
На данный момент мой журнал показывает все предметы и их значения, но показывает, могу ли я позволить себе только первый. Что я должен поместить в скобки IF, чтобы проверить каждое значение после того, как оно появится в журнале?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LearningCurve : MonoBehaviour
{
public int currentGold = 3;
void Start()
{
Dictionary<string, int> itemInventory = new Dictionary<string, int>()
{
{"Potions", 4 },
{"Daggers", 3 },
{"Lockpicks", 1 }
};
foreach (KeyValuePair<string, int> itemCost in itemInventory)
{
Debug.LogFormat("Item {0} - {1}g", itemCost.Key, itemCost.Value);
if (currentGold >= itemCost.Value)
{
Debug.Log("I can afford that!");
}
}
}
Ваш текущий код проверяет, можете ли вы позволить себе каждый отдельный предмет в itemInventory
. Вы имеете в виду, что хотите проверить, есть ли у вас 8
золота, необходимого для покупки все предметов в itemInventory
?
При тестировании фрагмента кода в консоли появилось два лога: «Я могу себе это позволить!». Благодаря этому я определил, что проблема заключается в реализации вашего фрагмента. Я предлагаю вам проверить, включили ли вы функцию «Свернуть» в консоли.
Я приложил ссылку Imgur для справки. Журнал консоли
Я не уверен, понял ли я вопрос, но я попытаюсь дать вам общий обзор того, что происходит в коде, который вы разместили. Давайте начнем с if, как работает блок if, просто вы помещаете boolean bool для краткости в C#, который может иметь два разных значения true и false, внутри if (BOOL VALUE), и если значение истинно, он запустит код между {CODE TO RUN}. Давайте немного рефакторим код, чтобы увидеть, что здесь происходит.
Dictionary<string, int> itemInventory = new Dictionary<string, int>()
{
{"Potions", 4 },
{"Daggers", 3 },
{"Lockpicks", 1 }
};
foreach (KeyValuePair<string, int> itemCost in itemInventory)
{
Debug.LogFormat("Item {0} - {1}g", itemCost.Key, itemCost.Value);
bool iCanBuyitem = currentGold >= itemCost.Value;
Debug.LogFormat("{0} >= {1} is {2}", currentGold, itemCost.Value,iCanBuyitem);
if (iCanBuyitem)
{
Debug.LogFormat("I can buy {0} ", itemCost.Key);
}else
{
Debug.LogFormat("I can't buy {0} ", itemCost.Key);
}
}
В отличие от математики в программировании символ >= не является символом равенства, а чем-то, называемым бинарным оператором, который принимает две переменные одного из многих числовых типов в С# в вашем словаре, они являются целыми числами Dictionary<string, int> и производят логическое значение, которое сообщает вам, если одно число больше или равно второму числу, это метод, который имеет что-то похожее на следующую подпись public bool FirstIsBiggerOrEqualToSecond(int first, int second)
Вот скрипт dotnet, демонстрирующий вывод https://dotnetfiddle.net/oWlYlY
Да, это так, спасибо большое! Я использовал ваши примеры bool и if/else, и он работал так, как я хотел, извините, я так плохо описал свою проблему. Я понимаю большинство из того, что вы сказали, но я не понимаю, почему ваш код внутри оператора IF применяется ко всем трем позициям в словаре, а не только к первой, как это сделал мой код. Это оператор bool или «else», в чем разница и проверяется, если оператор после того, как каждая пара словаря отображается в журнале?
@Gargatyk Не беспокойтесь о вопросе, который важно изучить, я бы порекомендовал, прежде чем прыгать в Unity, пройти несколько базовых руководств по C#, чтобы понять основы программирования dotnet.microsoft.com/en-us/learn/csharp
Прочитайте заголовок вопроса. Вы имеете в виду, что если вы хотите поместить два или более условий внутри IF, вы должны использовать &&
оператор:
if (currentGold >= itemCost.Value && currentGold <= 15)
{
Debug.Log("I have enough gold to buy this item and it's cheap.");
}
Я действительно сбит с толку, потому что то, о чем вы просите («я понятия не имею, как проверить их все... Что я должен поместить в скобки ЕСЛИ, чтобы проверить каждое значение после того, как оно появится в журнале?») уже то, что вы разместили. foreach проходит через каждую пару в словаре.
itemCost.Key
— название предмета, аitemCost.Value
— стоимость в золоте. В вашем заявленииif
уже сверяется текущее золото со стоимостью предмета и отображается дополнительная строка журнала, если вы можете себе это позволить.