如何在C#7中返回多个值?[关闭]


72

是否可以从一个方法本地返回多个值?



3
好的方法是定义一个classstruct持有“多个值”并返回其中一个的实例。您会发现该方法的扩展性最佳。元组是个坏主意,因为如果您理解我的话,它们就太“自由形式”了。
芭丝谢芭

4
@Bathsheba:也许在公共API中(还没有足够的时间来判断)-但是在一个类甚至一个汇编中,我认为元组确实非常方便。如果您只想在一两个位置收集变量,为什么还要创建自己的整个类型来维护?
乔恩·斯基特

1
因为这种“正义”趋向于发展为必须满足其他要求。对我来说,元组将被那些完全太懒惰而无法创建自己的类型的人完全滥用。
芭丝谢芭

2
@Bathsheba:所以不要滥用它们,并建议不要滥用它们。在正确的位置使用它们-但是不要仅仅因为它们可能被滥用而完全拒绝它们。任何功能都可能被滥用,很多功能都可能被滥用。
乔恩·斯基特

Answers:


169

本地人是什么意思?

C#7具有一项新功能,由于元组类型元组文字,您可以从一个方法返回多个值。

以以下功能为例:

(string, string, string) MyCoolFunction() // tuple return type
{   
    //...        
    return (firstValue, secondValue, thirdValue);
}

可以这样使用:

var values = MyCoolFunction();
var firstValue = values.Item1;
var secondValue = values.Item2;
var thirdValue = values.Item3;

或使用解构语法

(string first, string second, string third) = MyCoolFunction();

//...

var (first, second, third) = MyCoolFunction(); //Implicitly Typed Variables

花一些时间检查文档,他们有一些很好的例子(这个答案就是基于它们的!)。


4
还值得指出的是,您也可以命名返回值,这使您可以按任何顺序对其进行解构。
Jim Aho

9
如果您有错误Predefined type 'System.ValueTuple´2´ is not defined or imported,请看这里:stackoverflow.com/a/38383064/789423
Beauty

1
上面没有提到的一件事让我非常困惑,这是因为可以使用解构语法,以便可以将方法返回的元组项分配给程序中较早定义的字段。而且,如果在匿名方法定义内调用该方法,则某些元组项可能会分配给在匿名方法外定义的字段,而某些会分配给在匿名方法内定义的字段。
RenniePet

我相信“本机”是指它可以即开即用-包括在标准框架中。这是这样,有时。请参阅此帖子:stackoverflow.com/questions/38382971/…–
nardnob

解构可以进一步缩短:var (first, second, third) = MyCoolFunction();
zmechanic

25

您正在寻找元组。这是一个例子:

static (int count, double sum) Tally(IEnumerable<double> values)
{
    int count = 0;
    double sum = 0.0;
    foreach (var value in values)
    {
        count++;
        sum += value;
    }
    return (count, sum);
}

...

var values = ...
var t = Tally(values);
Console.WriteLine($"There are {t.count} values and their sum is {t.sum}");

http://www.thomaslevesque.com/2016/07/25/tuples-in-c-7/中被盗的示例


-2

您也可以这样实现:

public class Program
{
    public static void Main(string[] args)
    {

        var values=GetNumbers(6,2);
        Console.Write(values);


    }

    static KeyValuePair<int,int> GetNumbers(int x,int y)
    {
        return new KeyValuePair<int,int>(x,y);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.