C#返回元组 - 就像Python一样

时间:2016-07-29 11:17:16

标签: c# python return tuples

我是OOP和C#的新手。我有一个强大的Python背景,我想知道在这个

中是否存在C#的等价物
#Python

def outputSmth():
    num1 = 3
    num2 = 3
    str1 = "Hi"

    return (num1, num2, str1)  #Returning a tuple that can later be accessed
                               # by index

如果没有直接的等价物,我怀疑它是什么,最合适的方法是什么?

这是我的功能:

//C#    
static tuple PrintUserCreationMnu()
    {
        Console.Clear();
        Console.WriteLine("----  Create the user ----\n");
        Console.Write("User ID               : "); string usrID = Console.ReadLine();
        Console.Write("First Name            : "); string f_Name = Console.ReadLine();
        Console.Write("Last Name             : "); string l_Name = Console.ReadLine();
        Console.Write("Expected leaving date : "); string l_Date = Console.ReadLine();

        return ; //Here I'd like to return all my inputted values
    }

谢谢!

2 个答案:

答案 0 :(得分:2)

您只需返回string[]List<string>

即可
static string[] PrintUserCreationMnu()
{
       // ...
    return new[]{ usrID, f_Name, l_Name, l_Date};
}

但总的来说,最好创建一个具有有意义属性的自定义类型User并返回它。然后,您可以通过属性而不是索引来访问它们:

static User PrintUserCreationMnu()
{
       // ...
    return new User{ UserId = usrID, FirstName = f_Name, LastName = l_Name, Date = l_Date};
}

更好的方法是使用intId作为日期的正确类型DateTime。您可以使用...TryParse方法(例如int.TryParse)来确保格式有效。

为了完整起见,是的,.NET也有tuples。但我不会经常使用它们,因为它不清楚Item4是什么。在他查看源代码之前没有人知道。因此,从方法中返回它不是一个好的类型(如果它是public则更少)。但是,这是:

static Tuple<string, string, string, string> PrintUserCreationMnu()
{
       // ...
    return Tuple.Create(usrID, f_Name, l_Name, l_Date);
}

答案 1 :(得分:0)

元组进入C#7(当前为6.0)。所以,遗憾的是还没有。

我无法等待它们,尤其是在处理返回多个参数的方法时(无需设置结构来处理它们)。

现在您需要返回类似ListDictionaryTuple类型的内容,但您必须将它们新建并在方法调用中组合它们然后分开从通话中接收他们。此外,在大多数这些构造中,您只能使用一种类型,因此您必须装入和装出像object这样的东西。有点痛!

您可以在C#7.0功能here上找到更多信息。

我认为你最好的选择是成为一个动态的expando对象。我担心这是我能做的最好的事情!

方法:

public object GetPerson()
{
    // Do some stuff
    dynamic person = new ExpandoObject();
    person.Name = "Bob";
    person.Surname = "Smith";
    person.DoB = new DateTime(1980, 10, 25);
    return person;
}

拨打:

dynamic personResult = GetPerson();
string fullname = personResult.Name + " " + personResult.Surname;
DateTime dob = personResult.DoB;