C # установить KeyValue для переменных в одной строке - PullRequest
0 голосов
/ 30 августа 2018

Есть ли краткая версия первых 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 ]

0 голосов
/ 30 августа 2018

Вы можете улучшить эту проблему, например:

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

GoodLuck.

0 голосов
/ 30 августа 2018

Ваш код выглядит достаточно просто, но только ради вашего вопроса вы можете деконструировать пары ключ-значение

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);
}
0 голосов
/ 30 августа 2018

Или вы можете переформатировать как:

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);
                       });
0 голосов
/ 30 августа 2018

Вы можете написать:

var go = Instantiate(prefab, root);
var line = go.GetComponent<UICraftItemRequirementLine>();
line.SetItem(ItemManager.GetItemDefinition(el.Key), el.Value);

но отладка будет сложнее (см. Комментарий выше @Corak)

...