【问题标题】:Calling a method within the same class在同一个类中调用方法
【发布时间】:2015-05-29 11:49:35
【问题描述】:

我正在开发一个简单的程序来生成一个值数组并对它们执行一些基本计算。我在从 Main 方法调用我的“平均”和“中位数”方法时遇到问题。我在下面附上了编译器错误。谢谢。

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 指令 还是程序集参考?)

【问题讨论】:

  • Mean() 方法是什么意思?正如错误所说,没有Array 的方法被调用。您是否尝试为Array 编写扩展方法?然后阅读:msdn.microsoft.com/en-us//library/bb383977.aspx
  • Linq 已经有了与mean相同的Average方法。此外,既然您已经计算了要写入控制台的最小值和最大值,为什么不将它们存储在变量中,只计算它们的中位数,而不是再次运行 MaxMin

标签: c# methods


【解决方案1】:

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)

【讨论】:

    【解决方案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;
        }
    }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 应该注意包含该方法的类必须是静态的才能工作。
      【解决方案4】:

      你遇到的问题是,如果你想要扩展方法,你需要在第一个参数之前使用关键字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 调用来提高代码效率,而多个 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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多