Чем заменить 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 шт):

Автор решения: Andrew

Код не проверял, но как-то так

public class Inventory
{
    public string[] inventorySlots = new string[9];

    public void InventorySorter(string name) =>
        inventorySlots.Where(x => x == null).ForEach(x => x = name);
}

Не очень оптимально по работе, зато красиво :)

Оптимизировать можно в том случае если понадобится, что наврядли в даном случае.

→ Ссылка
Автор решения: Kunoichi

Возможно Вам больше такой код понравится:

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);
    }
}
→ Ссылка
Автор решения: aepot

Можно доработать условие добавления элемента, например если строка не инициализирована 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 копий повторяющихся строк хранить в памяти, если можно хранить только по одному экземпляру каждой строки, и добывать ее с помощью числового индекса, хранящегося в инвентаре.

Подумайте над архитектурой того, что вы делаете. Чем раньше вы предусмотрите все возможные проблемы, тем легче будет потом разрабатывать приложение.

→ Ссылка