如何使方法采用未知数量的值?

时间:2013-06-26 13:58:44

标签: c# function return-value subroutine

为了解释一个简单例子的问题,让我们说:

我有一个方法,它取两个数字的平均值:

private double TakeAverage(double n1,double n2) 
{
    average = (number1 + number2) / 2.0000;
    return average;
}

我称之为:

textBox3.Text = (TakeAverage(number1, number2)).ToString();

Q1:

如何使此功能能够运行而无需多次调用,如:

TakeAverage(number1, number2, number3, number4, number5)  // as wanted number of times...

Q2:如何使这个函数按照值的数量改变返回值?

例如

Substring(1) //if it takes just one value, it returns all the chars after first char but
Substring(1,2)//if it takes two values, it returns 2 characters after first char

3 个答案:

答案 0 :(得分:3)

检查出来:

public double TakeAverage(params double[] numbers)
{
  double result = 0.0;

  if (numbers != null && numbers.Length > 0)
    result = numbers.Average();

  return result;
}

由于params允许客户端不发送任何内容,我们应该测试numbers是否存在且是否有项目。

用法:

double average = TakeAverage(1, 2, 3, 4.4);     //2.6
double anotherAverage = TakeAverage();          //0
double yetAnotherAverage = TakeAverage(null);   //0

更新

根据您的评论,我了解到您正在寻找一些名为重载的内容:您希望某个给定方法根据其参数采取不同的行为。

我举一个例子,你必须修改它以满足你的需要。

让我们假设,除了原始的TakeAverage方法之外,我们还想要另一个执行平均值并将其乘以给定数字的方法。它会是这样的:

public double TakeAverage(int factor, params double[] numbers)
{
  double result = 0.0;

  if (numbers != null && numbers.Length > 0)
    result = numbers.Average() * factor;

  return result;
}

用法:

double average = TakeAverage(1.0, 2, 3, 4.4);     //2.6
double notAnAverage = TakeAverage(1, 2, 3, 4.4);  //3.1333...

请注意,我必须明确说明第一个数字是double1.0),否则它会落在第二个重载上并乘以它。

答案 1 :(得分:1)

params - 关键字,您可以说您接受了未指定数量的参数。

来自MSDN

  

params关键字允许您指定采用可变数量参数的方法参数。

     

您可以发送以逗号分隔的参数声明中指定类型的参数列表,或者指定类型的参数数组。你也可以不发送任何参数。

     

方法声明中的params关键字后不允许使用其他参数,并且方法声明中只允许使用一个params关键字。

示例:

private double TakeAverage(params double[] numbers) 
{
     double average = 0.0;
     if(numbers != null && numbers.Length > 0){
     foreach(double d in numbers)
          average += d;
     average /= numbers.Length;
     }
     return average;
}

答案 2 :(得分:1)

回应你的子串函数问题。

如果指定一个参数,例如子字符串(5),它将返回字符串中第5个字符之后的所有字符。 如果我有字符串“elephant”,它将返回“ant”。

如果我向函数添加第二个参数,它将从第一个给定参数开始,如上所述,并在停止之前继续x个字符。 如果我们使用上面的示例字符串“elephant”并执行子字符串(5,1),它将返回“a”。

(解决这个问题的好方法是添加两个数字,这将是字符串中的最后一个字符!)

我要求它做的是从给定字符串中的第5个字符创建一个新字符串,并将新字符串设置为1个字符长。

这是因为字符串类重载了子字符串方法。

见这里:http://msdn.microsoft.com/en-us/library/system.string.substring(v=vs.71).aspx