C#将键值设置为一行中的变量

问题描述 投票:0回答:4

是否有前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);
        }

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

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

c# linq syntactic-sugar
4个回答
3
投票

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

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

1
投票

你可以写:

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

但是调试会更难(参见上面@Corak的评论)


1
投票

或者您可以重新格式化:

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
投票

您可以改善此问题,例如:

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表达式。

祝好运。

© www.soinside.com 2019 - 2024. All rights reserved.