C#函数返回两个值[重复]

Posted

技术标签:

【中文标题】C#函数返回两个值[重复]【英文标题】:C# Function returning two values [duplicate] 【发布时间】:2011-03-09 00:08:25 【问题描述】:

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

例子:

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!

编辑:

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

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

如何做到这一点?

【问题讨论】:

是的,完全有可能,但是您遇到了什么问题? 我不知道如何返回这两个项目,因为“返回”方法只包含一个项目 你使用的是哪个版本的c#? 【参考方案1】:

您可以在参数上使用“out”关键字

【讨论】:

你能粘贴示例代码吗,因为这对我来说是新的 链接上有例子【参考方案2】:

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

【讨论】:

使用结构应该是合乎逻辑的方式,因为数据似乎是相关的,所以无论如何它应该是一个类/结构。 我同意。结构/类是最面向对象的方式。它还将使功能面向未来,因为它对修改关闭但对扩展开放。这意味着您不必更改函数签名(返回值/参数)即可扩展函数,您只需扩展作为参数传递的类/结构。【参考方案3】:

有几个选项,使用 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

【讨论】:

他想要一个整数和一个数组。在您的示例中,您有两个整数。 @Petar Minchev - 感谢您的澄清。我没有从问题中得到这个...【参考方案4】:

您有几个选择(按照我的偏好排序):

创建一个类并返回它:

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[]  ... ;

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

【讨论】:

一个小东西,但是直到 .Net Framework 4 才内置 Tuple @CaptainCasey:好点子,我本来想提的,但我忘了:) +1 以获得全面的答案——尽管我认为根据编写不可维护代码的原则,您忽略了为第二个输出值设置未记录全局的选项;) 而不是new Tuple&lt;int[], int&gt;( ..., ... );,使用Tuple.Create( ..., ... );。这样您就可以获得类型推断的所有好处。 @Porges:哦!我不知道!谢谢!【参考方案5】:

尝试使用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;

参考文献

http://msdn.microsoft.com/en-us/magazine/dd942829.aspx http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/

【讨论】:

我应该添加一些参考资料吗? 元组编码很好而且很快,但是它们降低了代码的可读性,因为你不得不引用属性“Item1”和“Item2”。我会花时间按照下面其他答案中的建议编写一个结构。【参考方案6】:

可能。使用结构。

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

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

【讨论】:

@JaredPar - 实际上 C#(分号除外)比 C++ 更有效,C++ 没有方法级可访问性说明符和 C,其中根本没有 public 关键字。跨度> @Igor,自从我发布原始评论(现已删除)以来,答案的文本发生了变化。它有一个 typedef 调用。 哦,对了。那就不用担心了。我以为你指的是分号。【参考方案7】:

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

第一种方法:

//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...

【讨论】:

以上是关于C#函数返回两个值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从c#中的方法返回多个值[重复]

C#函数查找两个数字的增量[重复]

在一个函数中返回两个变量[重复]

为啥 const char* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]

在c#中将十进制值转换为两个精度[重复]

c#的main怎么调用