代码之家  ›  专栏  ›  技术社区  ›  jeff17237

c 7个带元组的输出变量

  •  -2
  • jeff17237  · 技术社区  · 8 年前

    是否可以使用 C#7 feature of out variables 当输出变量是 Tuple 是吗?

    确切的情况是:

    private readonly Dictionary<int, (bool, DateTime)> _dictionary;
    
    public void SomeMethod(int number)
    {
        if (this._dictionary.TryGetValue(number, out (bool isTrue, DateTime timestamp)) // what is the correct syntax?
            // use isTrue and timestamp here
    }
    

    如果可能的话,我似乎找不到正确的语法。

    澄清:我希望能够直接解构成 isTrue timestamp 而不是创建另一个变量。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Dweeberly    8 年前

    请考虑以下代码:

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp1 {
    class Program {
        private static Dictionary<int, (bool, DateTime)> _dictionary;
    
        public static void SomeMethod(int number) {
            if (_dictionary.TryGetValue(number, out (bool isTrue, DateTime timestamp) booltime)) {
                Console.WriteLine($"Found it: {booltime.isTrue}, {booltime.timestamp}");
                }
            else {
                Console.WriteLine($"{number} Not Found");
                }
            }
    
        static void Main(string[] args) {
            _dictionary = new Dictionary<int, (bool, DateTime)>();
            _dictionary.Add(0, (true, DateTime.Now));
            SomeMethod(1);
            SomeMethod(0);
            }
        }
    }
    

    它将产生以下输出:

    1 Not Found
    Found it: True, 6/26/2018 4:56:59 PM
    

    通过在调用参数中定义变量或定义所需类型的单独变量,可以将元组作为out参数返回。您也可以像这样使用var关键字:

    if (_dictionary.TryGetValue(number, out var booltime)) {
        Console.WriteLine($"Found it: {booltime.Item1}, {booltime.Item2}");
        }
    

    注意,如果这样做,就没有命名元组属性,必须使用item1和item2。

        2
  •  0
  •   Paulo Morgado    8 年前

    是的,你可以!但你也在试图解构元组,这在那里是做不到的。

    试试这样的:

    public void SomeMethod(int number)
    {
        if (this._dictionary.TryGetValue(number, out var item))
        {
            var (isTrue, timestamp) = item;
        }
    }
    

    您可能希望(或应该)命名元组的值:

    private readonly Dictionary<int, (bool isTrue, DateTime timestamp)> _dictionary;
    

    然后可以使用值名称:

    public void SomeMethod(int number)
    {
        if (this._dictionary.TryGetValue(number, out var item))
        {
            // use item.isTrue;
            // use item.timestamp;
        }
    }