繁体   English   中英

调用同一类中的方法

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM