C# установить KeyValue для переменных в одной строке
Есть ли короткая версия первых 3 строк кода:
foreach (var el in craftSystem.requiredItems)
{
var type = el.Key;
var count = el.Value;
var itemDefinition = ItemManager.GetItemDefinition(type);
var go = Instantiate(prefab, root);
var line = go.GetComponent<UICraftItemRequirementLine>();
line.SetItem(itemDefinition, count);
}
установить подходящие имена переменных, например type, count в примере выше.
Я понимаю, что код выглядит хорошо и читабельно, и это может быть проще, потому что я использую переменную только один раз. Но мне нужно было знать, как это поставить в одну строку (см. Ответ).
4 ответа
Решение
Ваш код выглядит достаточно простым, но только ради вашего вопроса вы можете деконструировать пары ключ-значение
foreach ((var type, count) in requiredItems.Select(pair => (pair.Key, pair.Value)))
{
var itemDefinition = ItemManager.GetItemDefinition(type);
var go = Instantiate(prefab, root);
var line = go.GetComponent<UICraftItemRequirementLine>();
line.SetItem(itemDefinition, count);
}
Или вы можете переформатировать как:
craftSystem.requiredItems.ToList().ForEach(el =>
{
var itemDefinition = ItemManager.GetItemDefinition(el.Key);
var go = Instantiate(prefab, root);
var line = go.GetComponent<UICraftItemRequirementLine>();
line.SetItem(itemDefinition, el.Value);
});
Вы могли бы написать:
var go = Instantiate(prefab, root);
var line = go.GetComponent<UICraftItemRequirementLine>();
line.SetItem(ItemManager.GetItemDefinition(el.Key), el.Value);
но было бы сложнее отлаживать (см. комментарий выше от @Corak)
Вы можете улучшить эту проблему, как:
dataList.requiredData.ToList().ForEach(x =>
{
var item = ItemManager.GetItemDefinition(x.Key);
var instance = Instantiate(prefab, root);
var line = go.GetComponent<UICraftItemRequirementLine>();
line.SetItem(itemDefinition, x.Value);
});
В C# у нас есть метод расширения вроде ForEach()
это работает как foreach(), но с лямбда-выражением.
Удачи.