在同一个 class 中调用方法

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):

error CS1061: 'System.Array' does not contain a definition for 'Mean' and no extension method 'Mean' accepting a first argument of
type 'System.Array' could be found (are you missing a using directive or an assembly reference?)

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,将方法设为静态,并将方法放入静态 class .

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