C# 在一行中将 KeyValue 设置为变量

C# set KeyValue to variables in one line

有没有前三行代码的简版:

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);
        }

设置合适的变量名称,如类型,上面示例中的计数。

我知道代码看起来很好,可读性强,而且可以更简单,因为我只使用了一次变量。但我需要知道如何将它放在一行中(参见答案)。

你可以这样写:

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

但调试起来会更困难(请参阅上面@Corak 的评论)

你的代码看起来很简单,但是为了你的问题你可以解构键值对

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);
                       });

您可以像这样改进这个问题:

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() 相同,但带有 lambda 表达式。

祝你好运。