如何从一个方法返回多个值?

时间:2018-09-27 04:35:52

标签: c#

我想从C#中的方法返回年龄值,如下所示

private int UpdateAges( int age1,  int age2,  int age3,  int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return (age1, age2, age3, age4);
}

我可以像下面一样使用它

MessageBox.Show(UpdateAges(45, 30, 45, 30).ToString());

9 个答案:

答案 0 :(得分:5)

尝试一下:

private Tuple<int, int, int, int> UpdateAges( int age1,  int age2,  int age3,  int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;

    return Tuple.Create(age1, age2, age3, age4);
}

另请参阅:关于C# 7 new included Tuples syntax

答案 1 :(得分:4)

如果只想在消息框中显示结果,则返回一个字符串:

private string UpdateAges(int age1, int age2, int age3, int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return "age1 = " + age1 + ", age2 = " + age2 + ", age3 = " + age3 + ", age4 = " + age4;
}

MessageBox.Show(UpdateAges(45, 30, 45, 30));

如果您还想在显示的消息框后更新年龄值,请为每个参数添加ref关键字。

private string UpdateAges(ref int age1, ref int age2, ref int age3, ref int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return "age1 = " + age1 + ", age2 = " + age2 + ", age3 = " + age3 + ", age4 = " + age4;
}

MessageBox.Show(UpdateAges(ref age1, ref age2, ref age3, ref age4));

答案 2 :(得分:3)

请参阅-How to Return Multiple Values From a Function in C#

从函数中返回多个值的方法很少。

  1. 参考参数
  2. 输出参数
  3. 返回数组
  4. 返回类/结构类型的对象-这是我们通常遵循的方式
  5. 返回元组

Ref-在C#7中,借助tuple typestuple literals,您可以从一个方法中返回多个值。

(int, int, int, int) UpdateAges(int age1,  int age2,  int age3,  int age4) // tuple return type
{   
    age1++;
    age2++;
    age3++;
    age4++;

    return (age1, age2, age3, age4);
}

使用:

var values = UpdateAges(1, 2, 2, 3);

使用元组:

private Tuple<int, int, int, int> UpdateAges(int age1, int age2, int age3, int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;

    return Tuple.Create(age1, age2, age3, age4);
}

答案 3 :(得分:1)

您还可以像这样使用'out int'。

private void UpdateAges(int IAge1, int IAge2, int IAge3, int IAge4, out int OAge1, out int OAge2, out int OAge3, out int OAge4)
{
    OAge1 = IAge1++;
    OAge2 = IAge2++;
    OAge3 = IAge3++;
    OAge4 = IAge4++;
}

当您称呼它时,您需要像这样使用。

UpdateAges( Age1, Age2, Age3, Age4, out Age1, out Age2, out Age3, out Age4 );

答案 4 :(得分:1)

您可以通过多种方式解决此问题。

  1. 使用元组

    private Tuple<int, int, int, int> UpdateAges(int age1, int age2, int age3, int age4)
    {
        return Tuple.Create(++age1, ++age2, ++age3, ++age4);
    }
    
  2. 使用列表

    private List<int> UpdateAges(int age1, int age2, int age3, int age4)
    {
        return new List(){++age1, ++age2, ++age3, ++age4};
    }
    
  3. 使用数组

    private int[] UpdateAges(int age1, int age2, int age3, int age4)
    {
        var results = new int[4];
        results[0] = ++age1;
        results[1] = ++age2;
        results[2] = ++age3;
        results[3] = ++age4;
    }
    
  4. 使用参考参数

    private List<int> UpdateAges(ref int age1, ref int age2, ref int age3, ref int age4)
    {
        age1++;
        age2++;
        age3++;
        age4++;
    }
    

答案 5 :(得分:1)

如何使用列表:

private static List<int> UpdateAges(int age1, int age2, int age3, int age4)
{
    return new List<int> { ++age1, ++age2, ++age3, ++age4 };
}

然后这样称呼它:

Console.WriteLine(string.Join(",", UpdateAges(1, 2, 3, 4)));

好的,希望能帮上忙。

答案 6 :(得分:1)

虽然您可以使用Tupleref来实现所需的功能,但是我不确定这是否是您的最佳选择。

您可以使用专用的类封装所有逻辑:

public class Ages
{
    public int Age1 { get; set; }
    public int Age2 { get; set; }
    public int Age3 { get; set; }
    public int Age4 { get; set; }

    private void UpdateAges()
    {
        this.Age1++;
        this.Age2++;
        this.Age3++;
        this.Age4++;
    }

    private string ToString() => 
        $"Age1 = {this.age1}, Age2 {this.age2}, Age3 = {this.age3}, Age4 {age4}";
}

通过这种方式,与年龄相关的所有内容都集中在一个地方,并且可以在您的代码中重复使用。

您当然可以更进一步,并用List或Array替换“ age”属性。

public class Ages
{
    public int[] Ages { get; }

    public Ages (params int[] ages)
    {
        this.Ages = ages;
    }

    private void UpdateAges() =>
        for (int i = 0; i < this.Ages.Length; i++) this.Ages[i]++;

    private string ToString() =>  
        string.Join(", ", 
            this.Ages.Select((age, i) => $"Age{i} = {age}"));
}


var ages = new Ages(31, 40, 12, 18);
ages.UpdateAges();
MessageBox.Show(ages.ToString());

答案 7 :(得分:1)

使用方法参数params, 您可以在Enumerable,列表数组等中传递任意数量的参数返回。
通过灵活的调用Increment(1,2,3), Increment(1,2), Increment(myIntArray), Increment(1)`..

static IEnumerable<int> Increment(params int[] args)
{
    return args.Select(x => x + 1);
}

允许像这样的通话:

var result = Increment(45, 30, 45, 30);
// {46, 31, 46, 31}

对于显示,您可以使用string joinstring.Join(", ", result)

static void Main(string[] args)
{
    var uniqueValue = 99;
    var multipleValues = new[] { 1, 2, 6 };


    var uvResult = Increment(uniqueValue);
    var mvResult = Increment(multipleValues);


    Console.WriteLine($"uniqueValue = {uniqueValue}  => {string.Join(", ",uvResult)}");
    Console.WriteLine($"multipleValues = {string.Join(", ",multipleValues)}  => {string.Join(", ",multipleValues)}");

}

答案 8 :(得分:0)

1。用完:

static void UpdateAges(out int age1, out int age2)
{
    age1++;
    age2++;
}

int age1;
int age2;
UpdateAges(out age1, out age2);
Console.WriteLine(age1);
Console.WriteLine(age2);

2。使用Usng KeyValuePair:

static KeyValuePair<int, int> UpdateAges(age1, age2)
{
    return new KeyValuePair<int, int>(age1++, age2++);
}

int age1;
int age2;
var pair = GetTwoNumbers(age1,age2);
Console.WriteLine(pair.Key);
Console.WriteLine(pair.Value);

3。使用元组:

static Tuple<int, int> UpdateAges(age1, age2)
{
    return new Tuple<int, int>(age1++, age2++);
}

int age1;
int age2;
var tuple = UpdateAges(age1,age2);
int a = tuple.age1;
int b = tuple.age2;