【问题标题】:Possible to initialize multiple variables from a tuple?可以从一个元组初始化多个变量吗?
【发布时间】:2014-01-20 11:50:26
【问题描述】:

在某些语言(例如 PHP、Haskell 或 Scala)中,您可以通过类似于以下伪代码的方式从元组中分配多个变量:

list(string value1, string value2) = tupleWithTwoValues;

我找不到在 C# 中执行此操作的方法,但是,如果不编写更长、更丑陋的代码:

string firstValue = tupleWithTwoValues.Item1;
string secondValue = tupleWithTwoValues.Item2;

这种两行解决方案显然不是世界末日,但我一直在寻找编写更漂亮代码的方法。

有人知道更好的方法吗?

【问题讨论】:

标签: c# tuples


【解决方案1】:

从技术上讲,您可以使用以下语法使用单个语句而不是两个语句来执行此操作,尽管字符数几乎相同。

string firstValue = tupleWithTwoValues.Item1
    , secondValue = tupleWithTwoValues.Item2;

【讨论】:

    【解决方案2】:

    有效期至 C# 6:

    不,这是不可能的。 C# 中没有这样的语言功能。

    如果你认为下面的代码:

    string firstValue = tupleWithTwoValues.Item1;
    string secondValue = tupleWithTwoValues.Item2;
    

    很丑,那么你应该首先重新考虑使用元组。


    更新:从 C# 7 开始,元组解构现在是可能的。请参阅documentation 了解更多信息。

    也可以查看 Jared 的 answer

    【讨论】:

    • 我要补充一点,“四处移动”并不是您在 C# 中经常会做的事情。除非你想给它一个更短的名字,并在你的代码中多次使用它,你可能会直接访问tupleWithTwoValues.Item1,而不是把它放在一个变量中。
    • 是的。就在发布后几秒钟,我突然想到,每当我考虑元组时,一个更丰富的解决方案(如 DTO)通常是要走的路。
    • @Micah 是的,包括语义总是一个优点。元组通常只在非常特定的场景中是一件好事。
    • @Jared 感谢您指出这一点。更新了我的答案,尽管早在 2014 年该语言功能还不存在。
    【解决方案3】:

    不,这在 C# 中不受支持,尽管其他人建议添加这样的功能(herehere)。

    F# 支持,但是:

    let (f, b) = ("foo", "bar")
    

    【讨论】:

    【解决方案4】:

    当涉及到列表时,您可以这样做:

    var list = new List<string>{tuple.Item1, tuple.Item2};
    

    (没那么啰嗦) 但是对于多个变量,没有。你不能那样做。

    【讨论】:

      【解决方案5】:

      这就是我的工作:

      public static TResult Select<T1, T2, TResult>(this Tuple<T1, T2> source, Func<T1, T2, TResult> selector)
      {
          return selector(source.Item1, source.Item2);
      }
      // this allows us ...
      GetAssociationAndMember().Select((associationId,memberId) => {
          // do things with the aptly named variables
      });
      

      【讨论】:

        【解决方案6】:

        现在可以在 C# 7 中使用:

        public (string first, string last) FullName()
        {
            return ("Rince", "Wind");
        }
        
        (var first, var last) = FullName();
        

        您甚至可以使用单个 var 声明:

        var (first, last) = FullName();
        

        official documentation 中有关解构元组的更多信息。

        【讨论】:

          【解决方案7】:

          是的,这在 C# 中是可能的。 您需要在项目中安装包 Value.Tuple。 你可以这样做

          List<Tuple<string,string>>() lstTuple = GetYourTupleValue();
          foreach(var item in lstTuple)
          {
            (string Value1, string Value2 ) = item;
          }
          Console.WriteLine(item.Value1);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-11-21
            • 1970-01-01
            • 2014-06-12
            • 2011-10-21
            • 2013-03-04
            • 2014-07-26
            相关资源
            最近更新 更多