2015-05-29 77 views
1

我正在研究一个简单的程序来生成一个值数组并对它们执行一些基本的计算。从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指令 或程序集引用?)

+0

你所说的'平均()'方法意思?正如错误所说的那样,没有一种叫做“Array”的方法。你有没有尝试为'Array'写一个扩展方法?然后阅读:https://msdn.microsoft.com/en-us//library/bb383977.aspx –

+0

Linq已经有['Average'](https://msdn.microsoft.com/en-us/library/ vstudio/system.linq.enumerable.average(v = vs.100).aspx)方法与平均值相同。另外,既然你已经计算出了写入控制台的最小值和最大值,为什么不把它们存储在变量中,而只是从它们中计算中位数,而不是再次运行'Max'和'Min'? – juharr

回答

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

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

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

应该注意,包含该方法的类必须是静态的才能使其工作。 – juharr

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

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

相关问题