C#函数返回两个值

时间:2010-06-28 06:06:22

标签: c# .net arrays function

我想要一个函数,我将输入一个数组,因此我需要另一个数组和一个整数值。这可能吗?

示例:

private int[] FunctionName (int[] InputArray)
{
    //some function made here
    int intResult = xxxxx
    int[] array = xxxxx

    return intResult; //but here i need also to pass the new array!
}

编辑:

我需要的是以下(更新);

我有一个函数,作为输入什么都不需要,但内部生成两个项 - 数组+整数。我需要退回这两件物品吗? 您能告诉我如何使用这些物品吗?

如何做到这一点?

7 个答案:

答案 0 :(得分:22)

您有几种选择(按照我的偏好顺序):

创建一个类并返回:

class MyResult
{
    public int[] Array { get; set; }
    public int Integer { get; set; }
}

...

private MyResult FunctionName(int[] inputArray)
{
    return new MyResult { Array = ..., Integer = ... };
}

您可以使用内置类型,它基本上使自定义类的定义更容易:

private Tuple<int[], int> FunctionName(int[] inputArray)
{
    return Tuple.Create( ..., ... );
}

您可以使用out参数:

private int[] FunctionName(int[] inputArray, out int integerResult)
{
    integerResult = 123;
    return new int[] { ... };
}

(显然函数名称和属性等只是示例......我假设你会选择更有意义的名字)

答案 1 :(得分:8)

尝试使用Tuple类型。它旨在配对相关值,而无需定义新类型。

public Tuple<int[],int> MyFunction(int[] inputArray) {      
  ...
  int[] resultArray = ...
  int resultValue = ...;
  return Tuple.Create(resultArray,resultValue);
}

然后,您可以通过Item1Item2属性访问这些值。

Tuple<int[],int> tuple = MyFunction(myArray);
int[] array = tuple.Item1;
int value = tuple.Item2;

参考

答案 2 :(得分:4)

您可以在参数

上使用“out”关键字

答案 3 :(得分:4)

您有两个选项 - 将数组和整数值包装到类或结构中并返回它的实例。另一种选择是使用out参数 - link

答案 4 :(得分:2)

有三种简单的方法可以做到这一点:

第一种方法:

//use a struct to wrap values:
struct returnPair { public int number; public int[] array; }
private returnPair MyFunction(int arg1) {
   return new returnPair { number = ...., array = ...., };
}

首选struct到class,因为它是通过值传递的,因此避免了一些可变性问题,并且还避免了处理null。首选字段到属性,因为在这个用例中声明字段较短并且没有缺点。

第二种方法:

通过Tuple.Create(....,....)使用元组 - 这在其他答案中有解释。

第三种方法:

使用延续/回调。不要过头;但有时这是一个很好的选择;特别是当你想“返回”多个项目但不能轻易使用yield return策略时,例如在处理大量递归函数时,或者不支持枚举多次。它还具有允许相当可读的调用的优点 - 比C#中的元组更好。

private void MyFunction(int arg1, Action<int, int[]> yieldF) {
   yieldF(....num, ....arr);
   yieldF(....num2, ....arr2); //and again...
}
//call like this note that unlike a tuple params are labelled and readable,
//basically like a foreach loop with multiple loop variables:
MyFunction(3+4+5, (intp, arrp) => {
    Do-My-Side-Effect
});

偷偷摸摸的方法: - )

如果您偷偷摸摸(不推荐),您甚至可以将第一个和第三个选项以及滥用类型推断结合起来,以便在自动生成的只读类中包含命名参数: - )

private T MyFunction<T>(int arg1, Func<int, int[], T> yieldF) {
   return yieldF(....num2, ....arr2); //and again...
}
//...
var anontuple = MyFunction(3+4+5, (intp, arrp) => new { IntP = intp, ArrP = arrp, });
int foobar = anontuple.IntP + anontuple.ArrP[0];//with intellisense...

答案 5 :(得分:1)

可能的。使用结构。

struct retArguments{
    public int result;
    public int array[];
} ;

您也可以访问http://msdn.microsoft.com/en-us/library/aa288471%28VS.71%29.aspx

答案 6 :(得分:0)

有几个选项,使用outref数组,但我不建议使用它们,因为它们会促进带副作用的编程(这意味着你并不总是知道变量可能在哪里发生变化),使你的代码更难理解。

另一种选择是创建一个类来保存您需要的返回值 - 如果您需要的结果由不同类型(例如intint[])组成,这种方法很有效。如果返回的值属于一起并且逻辑上属于一个并且您可以重用该类,则这是一个很好的选择。

如果没有,您可以随时使用内置的通用Tuple类,这些类旨在将多个项目放在一起:

private Tuple<int,int[]> FunctionName (int[] InputArray)
{
    int intRes = ...;
    int intArrayRes = ...'
    Tuple<int,int[]> myResult = Tuple.Create(intRes, intArrayRes);
    ....
    return myResult; 
}

您可以使用各种ItemX属性访问这些值:

Tuple<int,int[]> result = FunctionName(myArray);
result.Item1; 'Gets the integer
result.Item2; 'Gets the integer array