我想要一个函数,我将输入一个数组,因此我需要另一个数组和一个整数值。这可能吗?
示例:
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!
}
编辑:
我需要的是以下(更新);
我有一个函数,作为输入什么都不需要,但内部生成两个项 - 数组+整数。我需要退回这两件物品吗? 您能告诉我如何使用这些物品吗?
如何做到这一点?
答案 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);
}
然后,您可以通过Item1
和Item2
属性访问这些值。
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)
有几个选项,使用out
和ref
数组,但我不建议使用它们,因为它们会促进带副作用的编程(这意味着你并不总是知道变量可能在哪里发生变化),使你的代码更难理解。
另一种选择是创建一个类来保存您需要的返回值 - 如果您需要的结果由不同类型(例如int
和int[]
)组成,这种方法很有效。如果返回的值属于一起并且逻辑上属于一个并且您可以重用该类,则这是一个很好的选择。
如果没有,您可以随时使用内置的通用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