是否有前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);
}
设置合适的变量名,如上面的例子中的类型,计数。
我知道代码看起来很好,可读性也可以更简单,因为我只使用一次变量。但我需要知道如何把它放在一行(见答案)。
您的代码看起来很简单,但只是为了您的问题,您可以解构键值对
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);
}
你可以写:
var go = Instantiate(prefab, root);
var line = go.GetComponent<UICraftItemRequirementLine>();
line.SetItem(ItemManager.GetItemDefinition(el.Key), el.Value);
但是调试会更难(参见上面@Corak的评论)
或者您可以重新格式化:
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表达式。
祝好运。