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(), но с лямбда-выражением.

Удачи.

Другие вопросы по тегам