Чем заменить string.Empty?
Чтобы метод InventorySorter работал пришлось каждому элементу массива присвоить string.Empty
Как можно обойтись без этого?
public class Inventory
{
public string[] inventorySlots = new string[9] {string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty };
public void InventorySorter(string name)
{
for (int i = 0; i < inventorySlots.Length; i++)
{
if (inventorySlots[i] == string.Empty)
{
inventorySlots[i] = name;
break;
}
}
}
}
Ответы (3 шт):
Код не проверял, но как-то так
public class Inventory
{
public string[] inventorySlots = new string[9];
public void InventorySorter(string name) =>
inventorySlots.Where(x => x == null).ForEach(x => x = name);
}
Не очень оптимально по работе, зато красиво :)
Оптимизировать можно в том случае если понадобится, что наврядли в даном случае.
Возможно Вам больше такой код понравится:
public class Inventory
{
public const int inventorySlotsLimit = 9;
public List<string> inventorySlots = new List<string>();
public void AddItem(string name)
{
if(inventorySlots.Count + 1 > inventorySlotsLimit)
{
throw new Exception("Inventory overflow");
}
inventorySlots.Add(name);
}
}
Можно доработать условие добавления элемента, например если строка не инициализирована null или пуста, то ячейку считать пустой. Здесь неоднозначность какую ячейку инвентрая считать пустой: null или ""? Обе?
Тогда условие проверки должно всегда проверять оба эти условия. Например условие для пустой ячейки можно реализовать так: if (string.IsNullOrEmpty(inventorySlots[i])) {...}, а для не пустой вот так if (inventorySlots[i]?.Length > 0) {...}.
Однозначности можно конечно достичь тем путем, который вы выбрали, избежать null с помощью инициализации массива пустыми строками, в этом случае инициализацию можно упростить вот так:
public string[] inventorySlots = Enumerable.Repeat(string.Empty, 9).ToArray();
Посмотрите другие статические методы класса Enumerable, там много всего полезного.
Затем можно оптимизировать сравнение if (inventorySlots[i].Length == 0).
Но я бы на вашем месте в инвентаре хранил бы не строки, а числа int[], и отдельно словарь с элементами инвентаря Dictionary<int, string>, где по айдишнику элемента можно получить название элемента и возможно другие его характеристики. Так же, если вы захотите переименовать элемент, или использовать локализации, например интерфейс игры на русском и английском, тогда это не затронет сам инвентарь.
В случае с хранением айдишников int - все будет вполне однозначно, 0 - пусто, или -1 - пусто, просто выберите, что вам больше по душе. К тому же в C# числовые операции сравнения работают значительно быстрее, чем строковые. А еще строка занимает больше памяти. Представьте 1000 инвентарей, хранящих строки, содержащие одни и те же элементы, зачем столько 9000 копий повторяющихся строк хранить в памяти, если можно хранить только по одному экземпляру каждой строки, и добывать ее с помощью числового индекса, хранящегося в инвентаре.
Подумайте над архитектурой того, что вы делаете. Чем раньше вы предусмотрите все возможные проблемы, тем легче будет потом разрабатывать приложение.