【问题标题】:Python-like list unpacking in C#?在 C# 中类似 Python 的列表解包?
【发布时间】:2011-10-04 23:55:13
【问题描述】:

在python中,我可以这样做:

List=[3, 4]

def Add(x, y):
    return x + y

Add(*List) #7

在 C# 中有什么方法可以做到这一点或类似的东西吗?基本上我希望能够将参数列表传递给任意函数,并将它们作为函数的参数应用,而无需手动解包列表并调用函数显式指定参数。

【问题讨论】:

    标签: c# iterable-unpacking


    【解决方案1】:

    嗯,最接近的是反射,但那是在缓慢的一面......但看看MethodInfo.Invoke......

    【讨论】:

      【解决方案2】:

      您可以在定义方法时使用 params 关键字,然后您可以直接将列表(在调用 ToArray 之后)放入方法调用中。

      public static void UseParams(params object[] list)
      {
              for (int i = 0; i < list.Length; i++)
              {
                  Console.Write(list[i] + " ");
              }
              Console.WriteLine();
      }
      

      ...稍后您可以使用以下命令调用它。

      object[] myObjArray = { 2, 'b', "test", "again" };
      UseParams(myObjArray);
      

      供参考:http://msdn.microsoft.com/en-us/library/w5zay9db.aspx

      【讨论】:

        【解决方案3】:

        你不能,你可以做一些只需要挥手就可以完成的事情(要么屈服于 foreach,要么在接受 lambda 的集合上添加一个 foreach 扩展方法),但没有什么比你在 python 中获得的优雅.

        【讨论】:

          【解决方案4】:
          Func<List<float>, float> add = l => l[0] + l[1];
          var list = new List<float> { 4f, 5f };
          add(list); // 9
          

          或:

          Func<List<float>, float> add = l => l.Sum();
          var list = new List<float> { 4f, 5f };
          add(list); // 9
          

          考虑到它是静态类型的,是你在 c# 中得到的最接近的。您可以查看 F# 的模式匹配,了解您正在寻找的内容。

          【讨论】:

          • 您的第一个建议仅适用于包含 2 个元素的列表。要在不使用 Sum() 的情况下使您的第一个建议更通用,您可以使用 Func, float> add = l => l.Aggregate((float)0, (aggregation, current) => aggregation + current);但是 Sum() 似乎是去这里的方式:)
          猜你喜欢
          • 1970-01-01
          • 2011-10-28
          • 2020-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-29
          • 2013-02-16
          • 2013-06-05
          相关资源
          最近更新 更多