2015-05-29 74 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); 
} 

另請注意,平均值和中位數的計算使用整數除法將導致截斷。

相關問題