2013-05-12 5 views
-2

Я получаю следующее сообщение об ошибке:System.Collections.Generic.IEnumerable»не содержит определения для„CalculateInt32“C#

"Error 1 'System.Collections.Generic.IEnumerable<WindowsFormsApplication1.Form1.HRData>' does not contain a definition for 'CalculateInt32' and no extension method 'CalculateInt32' accepting a first argument of type 'System.Collections.Generic.IEnumerable<WindowsFormsApplication1.Form1.HRData>' could be found (are you missing a using directive or an assembly reference?)" 

Я не знаю, что я делаю неправильно, также вот пример моего кода, который он имеет отношение к:

public class HRData 
    { 
     public int? HeartRate 
     { 
      get; 
      set; 
     } 
     public int? Speed 
     { 
      get; 
      set; 
     } 
     public int? Power 
     { 
      get; 
      set; 
     } 
     public int? Altitude 
     { 
      get; 
      set; 
     } 

     public override string ToString() 
     { 
      return String.Format("Heart rate={0}, Speed={1}, Power={2}, Altitude={3}", HeartRate, Speed, Power, Altitude); 
     } 
    }  

public static class HRDataExtensions 
    { 
     static private int? CalculateInt32(this IEnumerable<HRData> data, Func<HRData, int?> valueSelector, Func<IEnumerable<int?>, int?> aggregation) 
     { 
      List<int?> list = new List<int?>(); 
      list.AddRange(data.Select(valueSelector)); 
      return aggregation(list); 
     } 

     static private int? CalculateDouble(this IEnumerable<HRData> data, Func<HRData, int?> valueSelector, Func<IEnumerable<int?>, double?> aggregation) 
     { 
      List<int?> list = new List<int?>(); 
      list.AddRange(data.Select(valueSelector)); 
      double? result = aggregation(list); 
      return (result == null) ? null : (int?)Math.Round(result.Value); 
     } 

     static public int? MinimumHeartRate(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.HeartRate, Enumerable.Min); 
     } 
     static public int? MaximumHeartRate(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.HeartRate, Enumerable.Max); 
     } 

     static public int? AverageHeartRate(this IEnumerable<HRData> data) 
     { 
      return data.CalculateDouble(hr => hr.HeartRate, Enumerable.Average); 
     } 

     static public int? MinimumSpeed(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.Speed, Enumerable.Min); 
     } 

     static public int? MaximumSpeed(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.Speed, Enumerable.Max); 
     } 

     static public int? AverageSpeed(this IEnumerable<HRData> data) 
     { 
      return data.CalculateDouble(hr => hr.Speed, Enumerable.Average); 
     } 

     static public int? MinimumPower(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.Power, Enumerable.Min); 
     } 

     static public int? MaximumPower(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.Power, Enumerable.Max); 
     } 

     static public int? AveragePower(this IEnumerable<HRData> data) 
     { 
      return data.CalculateDouble(hr => hr.Power, Enumerable.Average); 
     } 

     static public int? MinimumAltitude(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.Altitude, Enumerable.Min); 
     } 

     static public int? MaximumAltitude(this IEnumerable<HRData> data) 
     { 
      return data.CalculateInt32(hr => hr.Altitude, Enumerable.Max); 
     } 

     static public int? AverageAltitude(this IEnumerable<HRData> data) 
     { 
      return data.CalculateDouble(hr => hr.Altitude, Enumerable.Average); 
     } 
    } 

    public static class HRDataReader 
    { 
     static private int? ConvertValue(string[] values, int index) 
     { 
      if (index >= values.Length) 
       return null; 
      int value; 
      if (int.TryParse(values[index], out value)) 
       return value; 
      return null; 
     } 

     static public IList<HRData> Read(string fileName) 
     { 
      if (string.IsNullOrEmpty(fileName)) 
       throw new ArgumentNullException("fileName"); 
      using (StreamReader sr = new StreamReader(fileName)) 
      { 
       string line; 

       // First: Skip to the correct section. 
       while ((line = sr.ReadLine()) != null) 
        if (line == "[HRData]") 
         break; 

       // Now: Read the HRData 
       List<HRData> data = new List<HRData>(); 
       while ((line = sr.ReadLine()) != null) 
       { 
        if (line.StartsWith("[") && line.EndsWith("]")) 
         break; 
        line = line.Trim().Replace("\t", " "); // Remove all tabs. 
        while (line.Contains(" ")) // Remove all duplicate spaces. 
         line = line.Replace(" ", " "); 
        string[] values = line.Split(' '); // Split the line up. 
        data.Add(new HRData 
        { 
         HeartRate = ConvertValue(values, 0), 
         Speed = ConvertValue(values, 1), 
         Power = ConvertValue(values, 2), 
         Altitude = ConvertValue(values, 3) 
        }); 
       } 
       return data; 
      } 
     } 
    } 

Вот вторая часть моего кода, надеюсь, что это поможет. Он получил все выходы и т. Д.

private void button1_Click(object sender, EventArgs e) 
    { 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      dataGridView1.Rows.Clear(); 
      dataGridView1.Columns.Clear(); 

      IList<HRData> data = HRDataReader.Read(openFileDialog1.FileName); 

      dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { Name = "HeartRate", HeaderText = "Heart rate", DataPropertyName = "HeartRate" }); 
      dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { Name = "Speed", HeaderText = "Speed", DataPropertyName = "Speed" }); 
      dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { Name = "Power", HeaderText = "Power", DataPropertyName = "Power" }); 
      dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { Name = "Altitude", HeaderText = "Altitude", DataPropertyName = "Altitude" }); 

      dataGridView1.DataSource = data; 

      label1.Text = data.MaximumAltitude().ToString(); 

      textBox1.Text = data.MaximumSpeed().ToString(); 
      textBox2.Text = data.AverageSpeed().ToString(); 
      textBox3.Text = data.AverageHeartRate().ToString(); 
      textBox4.Text = data.MaximumHeartRate().ToString(); 
      textBox5.Text = data.MinimumHeartRate().ToString(); 
      textBox6.Text = data.AveragePower().ToString(); 
      textBox7.Text = data.MaximumPower().ToString(); 
      textBox8.Text = data.AverageAltitude().ToString(); 
      textBox9.Text = data.MaximumAltitude().ToString(); 
     } 
    } 
+0

Не могли бы вы отправить результат 'typeof (HRData) .ToString()' пожалуйста? –

+0

Извините, я не знаю, что именно вы имеете в виду. – user2047427

+0

Просто создайте статический метод в классе, который возвращает 'string', а затем сделает его' return typeof (HRData) .ToString(); '. Могу ли я получить то, что возвращает этот метод? –

ответ

6

Ваши первые два метода расширения в настоящее время являются закрытыми. Вы хотели сделать их публичными?

Предполагается, что ошибка находится в другом классе, который пытается позвонить CalculateInt32 - это непонятно из вашего вопроса.

Кроме того, непонятно, почему вы создаете список в CalculateInt32. Почему бы просто не использовать:

private static int? CalculateInt32(this IEnumerable<HRData> data, 
            Func<HRData, int?> valueSelector, 
            Func<IEnumerable<int?>, int?> aggregation) 
{ 
    return aggregation(data.Select(valueSelector)); 
} 

(Как в стороне, я обычно вижу модификатор доступа перед статическим модификатором Оба являются действительными, но public static просто чаще, чем static public.).

EDIT: Кроме того, я вижу, что ваше сообщение об ошибке говорит о WindowsFormsApplication1.Form1.HRData - возможно ли, что у вас есть два типа HRData, один вложенный один и один не вложенный?

+0

Я пытался сделать их общедоступными, хотя это ничего не меняет. – user2047427

+1

@ user2047427: Это поможет, если вы покажете короткую, но * полную * программу, демонстрирующую проблему. –

+0

@ user2047427: См. Мое редактирование. Интересно, есть ли у вас разные типы здесь ... –

Смежные вопросы