Я хотел бы предложить вам рассмотреть возможность более одного элемента определенного типа в списке инвентаризации, то есть два или более телевизоров, а не только один.
Используйте базовый класс и производные классы:
public class InventoryItem
{
public string ItemType { get; set; }
public string ItemName { get; set; }
public int ItemAmount { get; set; }
public int ItemACanHave { get; set; }
public bool ItemClear { get; set; }
public string ItemEffect { get; set; }
public float ItemModifier { get; set; }
public int ItemWeight { get; set; }
}
public class Radio : InventoryItem
{
}
public class Television : InventoryItem
{
}
// TODO: add your derived classes
Используйте List<InventoryItem>
для хранения коллекции:
List<InventoryItem> InventoryItems = new List<InventoryItem>();
Измените метод (не забудьте добавить обработку исключений, а иногда может получить различный ввод, чем тот, который вы ожидали в объекте args
):
protected virtual bool OnAttempt_AddItem(object args)
{
// TODO: handle unboxing exceptions, size of the array etc
//
try
{
object[] arr = (object[])args;
switch (arr[0].ToString().ToLower())
{
// TODO: add other types (Radio etc)
case "television":
var tv = new Television();
tv.ItemType = (string)arr[0];
tv.ItemName = (string)arr[1];
tv.ItemAmount = (arr.Length == 2) ? (int)arr[2] : 1;
tv.ItemACanHave = (arr.Length == 3) ? (int)arr[3] : 1;
tv.ItemClear = (bool)arr[4];
tv.ItemEffect = (string)arr[5];
tv.ItemModifier = (float)arr[6];
tv.ItemWeight = (int)arr[7];
// enforce ability to have atleast 1 item of each type
tv.ItemACanHave = Math.Max(1, tv.ItemACanHave);
InventoryItems.Add(tv);
break;
default:
var genericItem = new InventoryItem();
genericItem.ItemType = (string)arr[0];
genericItem.ItemName = (string)arr[1];
genericItem.ItemAmount = (arr.Length == 2) ? (int)arr[2] : 1;
genericItem.ItemACanHave = (arr.Length == 3) ? (int)arr[3] : 1;
genericItem.ItemClear = (bool)arr[4];
genericItem.ItemEffect = (string)arr[5];
genericItem.ItemModifier = (float)arr[6];
genericItem.ItemWeight = (int)arr[7];
// enforce ability to have atleast 1 item of each type
genericItem.ItemACanHave = Math.Max(1, genericItem.ItemACanHave);
InventoryItems.Add(genericItem);
break;
//handle other cases
}
return true;
}
catch (Exception ex)
{
// log the error
return false;
}
}
Получить отфильтрованные элементы, как это:
var largeTvType = inventory.InventoryItems.OfType<Television>()
// filter by type (or other criteria)
.Where(tv => tv.ItemType == "large")
// select only the property your interested in (in the case below
// it will be always "television" because that's part of the
// logic inside the OnAttempt_AddItem method's switch statement)
.Select(tv => tv.ItemType);
Тем не менее, как и ChrisWue предложил в своем ответе, если вы знаете, что ваши инвентарные списки будут очень большие, я бы рекомендовал вам использовать Dictionary<string, InventoryItem>
, ключ string
являющийся уникальным идентификатором товарной единицы. Это будет быстрее.
Есть ли причина, по которой вы по-прежнему используете не-общую коллекцию «Hashtable» вместо «Словарь <,>'? (Похоже, что вы должны создавать класс 'Item' для инкапсуляции всех этих значений btw.) –
Не использовали HashTable, однако есть ли проблемы с использованием самоопределяемого класса сущностей? – Fendy
Я довольно новичок в C# и его типах массивов. Если есть лучший метод, я бы очень признателен, если бы кто-нибудь мог познакомить меня с этим. –