【问题标题】:C# returning tuple - like PythonC# 返回元组 - 像 Python
【发布时间】:2016-12-04 02:12:15
【问题描述】:

我是 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
    }

谢谢!

【问题讨论】:

    标签: c# python return tuples


    【解决方案1】:

    您可以简单地返回 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};
    }
    

    最好使用正确的类型,int 用于IdDateTime 用于日期。您可以使用...TryParse 方法(例如int.TryParse)来确保格式有效。


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

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

    【讨论】:

    • 我的 ID 确实需要是一个字符串,因为 ID 的格式类似于 U001ABCD 但是是的,我想我会创建一个 User 类。
    • @Gaboik1:请注意,我已经编辑了答案以显示 C# 元组
    • “您可以简单地返回一个字符串 [] 或列表” - 这不会满足 OP 问题中的数字类型,而无需添加转换。
    • @MurrayFoxcroft:当然,您必须将字符串解析为所需的类型。这就是我对User-class 和“正确类型”提示的建议。 .NET4 元组已经支持不同的类型,因此您也可以根据需要返回 Tuple&lt;string, string, string, DateTime&gt;。但是你的 C#7 元组更好,不幸的是它们现在不存在
    • 是的,生活在一个梦幻世界。检查我的答案以获取动态选项。还是很乱。
    【解决方案2】:

    元组将在 C# 7 中出现(当前为 6.0)。所以,不幸的是还没有。

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

    现在您需要返回类似 ListDictionaryTuple 类型的内容,但您必须在方法调用中重新创建它们并将它们组装起来,然后在从调用中接收它们时分开.此外,在大多数这些构造中,您仅限于单一类型,因此您必须将对象之类的东西装进和装出。有点痛!

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

    我认为您最好的选择是动态扩展对象。恐怕这是我能做的最好的了!

    方法:

    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;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多