【问题标题】:C# set KeyValue to variables in one lineC# 将 KeyValue 设置为一行中的变量
【发布时间】:2019-02-05 01:36:03
【问题描述】:

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

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

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

【问题讨论】:

  • 为此使用List
  • 你想达到什么目的?您是指循环内的三行吗?
  • 您似乎只使用了这些“帮助”变量一次,那么为什么不只使用var itemDefinition = ItemManager.GetItemDefinition(el.Key); 和line.SetItem(itemDefinition, el.Value);? -- 甚至可能是var line = Instantiate(prefab, root).GetComponent&lt;UICraftItemRequirementLine&gt;(); --- 如果你真的 想要“保存线条”......但现在就是这样。它看起来很可读,那么为什么要改变它呢? -- 它现在更具可读性因为它有好几行了。
  • 是的,但是 LINQ 不会为你做这些。 LINQ 只能从您的输入中选择数据,它不会更改输入。使用List.Foreach 更改您的输入顺序

标签: c# linq syntactic-sugar


【解决方案1】:

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

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 foreach (var (type, count) in craftSystem.requiredItems.Select(pair =&gt; (pair.Key, pair.Value)))
【解决方案2】:

你可以写:

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

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

【讨论】:

  • 是的,这很简单,但是在 el.Key 和 el.Value 下没有意义
【解决方案3】:

或者你可以像这样重新格式化:

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

【讨论】:

    【解决方案4】:

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

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

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多