[英]Calling a method within the same class
我正在开发一个简单的程序,以生成值数组并对其进行一些基本计算。 我在从Main方法调用“ Mean”和“ Median”方法时遇到问题。 我在下面附加了编译器错误。 谢谢。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class arraymod
{
static void Main(string[] args)
{
int[] values;
values = new int[10];
Random rand = new Random();
for (int i = 0; i < 10; i++)
{
values[i] = rand.Next(1,20);
}
Array.Sort(values);
for (int i = 0; i < 10; i++)
{
Console.WriteLine(values[i]);
}
Console.WriteLine("Min: {0}", values.Min());
Console.WriteLine("Max: {0}", values.Max());
Console.WriteLine("Sum: {0}", values.Sum());
Console.WriteLine("Mean: {0}", values.Mean()); //program fails here
Console.WriteLine("Median: {0}", values.Median());
}
public int Mean(int[] arr)
{
int valuesMean = arr.Sum()/arr.Count();
return valuesMean;
}
public int Median(int[] arr)
{
int valuesMedian = (arr.Max()+ arr.Min())/2;
return valuesMedian;
}
}
}
arraymod.cs(29,42):
错误CS1061:“ System.Array”不包含“ Mean”的定义,也没有扩展方法“ Mean”接受以下项的第一个参数
可以找到“ System.Array”类型(是否缺少using指令或程序集引用?)
1)您需要调用Mean(values)
和Median(values)
2)Main是静态方法,而Mean和Median是实例方法。 创建arraymod的实例并调用它们:
var inst = new arraymod();
int mean = inst.Mean(values);
int median = inst.Median(values);
或者,将方法设为静态:
public static int Mean(int[] arr)
public static int Median(int[] arr)
您正在数组实例上调用Mean()
。 如果该平均值计算与LINQ Average
不同,请为其定义扩展方法。 例:
static int Mean(this int[] arr)
{
//implementation
}
您遇到的问题是,如果要扩展方法,则需要在第一个参数之前使用关键字this
,将方法设为静态,然后将该方法放入静态类中。
static class arraymod
{
public static int Mean(int[] arr)
{
int valuesMean = arr.Sum()/arr.Count();
return valuesMean;
}
public static int Median(int[] arr)
{
int valuesMedian = (arr.Max()+ arr.Min())/2;
return valuesMedian;
}
}
就个人而言,我不会为创建Mean
方法而烦恼,因为Average
已经完成了同样的事情。 而且,通过在一个循环中计算所有内容,而不是多次分别调用数组的多次Linq调用,可以使代码更高效。
static void Main(string[] args)
{
int[] values;
values = new int[10];
Random rand = new Random();
for (int i = 0; i < 10; i++)
{
values[i] = rand.Next(1,20);
}
int sum = 0;
int max = int.MinValue;
int min = int.MaxValue;
Array.Sort(values);
for (int i = 0; i < 10; i++)
{
sum += values[i];
if(values[i] < min)
{
min = values[i];
}
if(values[i] > max)
{
max = values[i];
}
Console.WriteLine(values[i]);
}
Console.WriteLine("Min: {0}", min);
Console.WriteLine("Max: {0}", max);
Console.WriteLine("Sum: {0}", sum);
Console.WriteLine("Mean: {0}", sum/values.Length);
Console.WriteLine("Median: {0}", (min + max)/2);
}
另请注意,均值和中位数的计算使用整数除法,这将导致截断。
这不是扩展方法。 您需要使方法静态并调用它们:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class arraymod
{
static void Main( string[] args )
{
int[] values;
values = new int[ 10 ];
Random rand = new Random();
for( int i = 0 ; i < 10 ; i++ )
{
values[ i ] = rand.Next( 1 , 20 );
}
Array.Sort( values );
for( int i = 0 ; i < 10 ; i++ )
{
Console.WriteLine( values[ i ] );
}
Console.WriteLine( "Min: {0}" , values.Min() );
Console.WriteLine( "Max: {0}" , values.Max() );
Console.WriteLine( "Sum: {0}" , values.Sum() );
Console.WriteLine( "Mean: {0}" , Mean( values ) ); //call
Console.WriteLine( "Median: {0}" , Median( values ) );//call
}
//make method "Mean" static
public static int Mean( int[] arr )
{
int valuesMean = arr.Sum() / arr.Count();
return valuesMean;
}
//make method "Median" static
public static int Median( int[] arr )
{
int valuesMedian = ( arr.Max() + arr.Min() ) / 2;
return valuesMedian;
}
}
}
或使用扩展方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
static class arraymod
{
static void Main( string[] args )
{
int[] values;
values = new int[ 10 ];
Random rand = new Random();
for( int i = 0 ; i < 10 ; i++ )
{
values[ i ] = rand.Next( 1 , 20 );
}
Array.Sort( values );
for( int i = 0 ; i < 10 ; i++ )
{
Console.WriteLine( values[ i ] );
}
Console.WriteLine( "Min: {0}" , values.Min() );
Console.WriteLine( "Max: {0}" , values.Max() );
Console.WriteLine( "Sum: {0}" , values.Sum() );
Console.WriteLine( "Mean: {0}" , values.Mean() ); //call
Console.WriteLine( "Median: {0}" , values.Median() );//call
}
//use extension method
public static int Mean( this int[] arr )
{
int valuesMean = arr.Sum() / arr.Count();
return valuesMean;
}
//use extension method
public static int Median( this int[] arr )
{
int valuesMedian = ( arr.Max() + arr.Min() ) / 2;
return valuesMedian;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.