在同一个类中调用方法

时间:2015-05-29 11:49:36

标签: c# methods

我正在研究一个简单的程序来生成一个值数组并对它们执行一些基本的计算。我在使用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'不包含的定义   '均值'并且没有延伸方法'意味着'接受第一个参数   可以找到类型'System.Array'(您是否缺少using指令   或汇编参考?)

4 个答案:

答案 0 :(得分:4)

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)

答案 1 :(得分:0)

您正在数组实例上调用Mean()。如果该计算方法与LINQ Average不同,请为其定义扩展方法。 例如:

static int Mean(this int[] arr)
{
    //implementation
}

答案 2 :(得分:0)

您遇到的问题是,如果您需要扩展方法,则需要在第一个参数之前使用关键字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);
}

另请注意,均值和中位数的计算使用整数除法,这将导致截断。

答案 3 :(得分:0)

这不是扩展方法。您需要将方法设为静态并调用它们:

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;
    }
}
}