2016-07-29 34 views
0

我是OOP和C#的新手。我有一个强大的Python的背景,我想知道是否有在C#这C#返回元组 - 像Python

#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 
    } 

谢谢!

回答

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}; 
} 

更妙的是要使用正确的类型,intIdDateTime的日期。您可以使用...TryParse方法(f.e。int.TryParse)确保格式有效。


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

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

我的ID真正需要的是一个字符串的ID的格式为U001ABCD但是,是我想我会创建一个User类。 – Gaboik1

+0

@ Gaboik1:请注意,我编辑了我的答案以显示C#元组 –

+0

“您可以简单地返回一个字符串[]或列表” - 这不会在OP的问题中迎合数字类型,而无需添加转换。 –

0

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

我不能等他们,特别是在处理返回更多的参数(而不必设置结构来处理它们)的方法时。

现在你需要返回有点像ListDictionaryTuple类型,但你有新的起来,并在方法调用和休息组装它们分开,然后从呼叫接收他们。此外,在这些构造的大部分中,你仅限于单一类型,所以你将不得不像对象一样进入和退出。有点痛苦!

您可以在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; 
+0

是的,这是一种痛苦。并感谢链接! C#7什么时候出来? – Gaboik1

+0

我的猜测是6-12个月。这里是讨论相关位的一个主题:http://www.strathweb.com/2016/03/enabling-c-7-features-in-visual-studio-15-preview/ –

+0

更好 - 这里是链接到路线图! https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md –