2017-09-14 2 views
-2

申し訳ありませんがわかりにくければ主な問題はCSVファイルからマークを取得し、それらのグレードを返す関数を書くことです。コードスニペットは問題のコードです。C#マークを受け入れてグレードを返すように機能を取得する

5時間のドキュメンテーションと実験の後、私はかなり疲れてしまい、わずかな進歩を遂げました。私は数週間前にC#で始まったばかりなので、初心者の言葉の意味ではすべて私は初心者です。

簡単に言えば、CSVファイル(CSVファイルには名前とマークが含まれています)を読み込む小さなアプリケーションを作成してから、StreamReaderを使用してコンテンツを分離し、リスト内の独自の値同じ名前空間内

public void buttonOpen_Click(object sender, RoutedEventArgs e) 
{ 
    System.Windows.Forms.OpenFileDialog openDialog = new System.Windows.Forms.OpenFileDialog(); 
    openDialog.Title = "Open File"; 
    openDialog.Filter = "CSV Files(*.csv)|*.csv|Text Files(*.txt)|*.txt|All files(*.*)|*.*"; 

    openDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

    if (openDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
    { 
     textBoxPath.Text = openDialog.FileName; 

     using (var reader = new StreamReader(openDialog.FileName)) 
     { 

      while (!reader.EndOfStream) 
      { 
       var line = reader.ReadLine(); 
       var values = line.Split(','); 
       Marks myMarks = new Marks(); 
       myMarks.FirstLastName = values[0]; 
       myMarks.MarksValue = values[1]; 
       Helper.arrayCSV.Add(myMarks); 
       System.Windows.Forms.MessageBox.Show(myMarks.MarksValue); 
      } 
     } 
    } 
    else 
    { 
     System.Windows.Forms.MessageBox.Show("You did not select a file"); 
     //Wrap in try catch statement 
    }   
} 

クラス

/// <summary> 
/// This takes the values from Marks and filters them for use. 
/// </summary> 
public class Helper 
{ 
    public static List<Marks> arrayCSV = new List<Marks>(); 

} 

/// <summary> 
/// The CSV Reads and then splits via the comma storing the values into the two strings below. 
/// </summary> 
public class Marks 
{ 
    public string FirstLastName { get; set; } 
    public string MarksValue { get; set; } 
} 

私は私のデータが保存され得ることができたら、私はMarksValueを計算する関数を記述しようとし始め、その後に保存されているマークに基づいてグレードを返しますCSVファイルグレーディングパラメータは、マークがある場合です。< 59 =失敗、60-78 =クレジット 79-89 =優等、90-100 =栄誉

私はこれまでに試したことがいくつかあります。どうもありがとうございました

namespace ICTPRG406 
{ 
    public class Grade 
    { 
     public int CollegeGrade(int a) 
     { 
      Marks myMarks = new ICTPRG406.MainWindow.Marks(); 

      myMarks.MarksValue = a.ToString(); 
      int answer = a; 

      return a; 

      /* if (a < 59) 
      { 
       MessageBox.Show("You failed"); 
      } 
      else if (a >= 60 && a <= 78) 
      { 
       MessageBox.Show("Credit"); 
      } 
      else if (a >= 79 && a <= 89) 
      { 
       MessageBox.Show("Distinction"); 
      } 
      else if (a >= 90 && a <= 100) 
      { 
       MessageBox.Show("Honours"); 
      } 
      else 
      { 
       MessageBox.Show("No Value Input"); 
      } 
      return a; 

      */ 
     } 
    } 
} 

はそれに基づいてメッセージを等級を計算し、印刷するには、それを取得、すなわちベイビーステップでそれをやろうとした、すべてのヘルプは大歓迎です。

+3

あなたの問題はどこですか? –

+0

申し訳ありませんが、私は偶然に投稿を入力し終える前に提出しました。問題は、最後のコードスニペットで自分のCSVファイルに格納されている値を計算する関数を書くのに苦労しています。初めてここに投稿すると、私はFAQを通して読んだ。 –

+0

各人のマークの合計を計算する場合は、LINQ GroupBy&Sumを1つの解決策として使用することをおすすめします。このhttps://stackoverflow.com/questions/6970070/linq-lambda-group- by-with-sum。 MarksValueは文字列ではなく数値として保存する必要があることに注意してください。 – PaulF

答えて

0

まず、特にStackOverflowを歓迎し、一般的にプログラミングします。

私たちはすべてどこかで始めました(ただし、私たちは忘れがちですが)。私はあなたのためにすべてを書くつもりはないが、私はあなたにいくつかのヒントを与えることを望む。あなたのマークを想定し

は整数であり、あなたのマーククラスは、に変更してください:

public class Marks 
{ 
    public string FirstLastName { get; set; } 
    public int MarksValue { get; set; } 
} 

今あなたが使用する必要があなたのループ内のCSVファイルからの読み取り時:できるだけ早くあなたが持っているよう

Marks myMarks = new Marks(); 
myMarks.FirstLastName = values[0]; 
int v; 
if (int.TryParse(values[1], out v)) 
{ 
    myMarks.MarksValue = v; 
} 
else 
{ 
    //report error here 
} 

合計を行う準備ができているファイルを読み終えました。あなたが必要とするのは次のようなものです。

var sum = Helper.arrayCSV.GroupBy(g => g.FirstLastName).Select(gs => new 
{ 
    FirstLastName = gs.Key, 
    TotalMarks = gs.Sum(g => g.MarksValue) 
}).ToList(); 

foreach (var s in sum) 
{ 
    if (s.TotalMarks < 59) 
    { 
     MessageBox.Show(s.FirstLastName + ": Failed"); 
    } 
    else if (s.TotalMarks >= 60 && s.TotalMarks <= 78) 
    { 
     MessageBox.Show(s.FirstLastName + ": Credit"); 
    } 
    else if (s.TotalMarks >= 79 && s.TotalMarks <= 89) 
    { 
     MessageBox.Show(s.FirstLastName + ": Distinction"); 
    } 
    else if (s.TotalMarks >= 90 && s.TotalMarks <= 100) 
    { 
     MessageBox.Show(s.FirstLastName + ": Honours"); 
    } 
} 

マークが小数点以下の場合は、代わりに小数点以下の型に変更してください。 TryParseには多くのバージョンがあります! TryParseを使用して、エラーについて考えてみましょう。一般的にはtry ... catchセクション内にコードを含める必要があります。

私はあなたにこれが始まることを望みます。

+0

あなたの洞察力のあるアドバイスとフレンドリーな言葉をありがとうございます。私は今論理がはるかに良く理解しています。 –

0

これは私の目を引くようにここに私の最初の答えですので、私はそれを私はあなたが尋ねたものを読んだと思ったが、私は2セントを入れていると思った。私はあなたがプロジェクト名、スコア、その課題のためのtotalPointsを持っていることを前提にしています。私はCsvConverter、Grade、LetterGradeと呼ばれるいくつかのクラスを作成しました。これは、Separation Of Concernsという名前があるため、これを指摘したいと思います。これにより、アプリを開発する際にきれいな構造を保つことができます。

これはpercentage.ToLetterGrade()と言うことができ、正しいグレードを返す拡張メソッドです。

public static class LetterGrade 
{ 
    public static string ToLetterGrade(this double percentage) 
    { 
     var letterGrade = "F"; 
     if (percentage >= 0.9) 
     { 
      letterGrade = "A"; 
     } 
     else if (percentage >= 0.8) 
     { 
      letterGrade = "B"; 
     } 
     else if (percentage >= 0.7) 
     { 
      letterGrade = "C"; 
     } 
     else if (percentage >= 0.6) 
     { 
      letterGrade = "D"; 
     } 
     return letterGrade; 
    } 
} 

//allows you to convert the CsvFile To a list to manipulate the data 
     public static class CsvConverter 
     { 
      public static IEnumerable<Grade> ToList(string csvText) 
      { 
       var gradeList = new List<Grade>(); 
       var lines = csvText.Split("\n\r".ToCharArray()); 
       foreach (var line in lines.Where(l=>!string.IsNullOrWhiteSpace(l))) 
       { 
        var lineArray = line.Split(','); 
        var score = 0; 
        var totalPoints = 0; 
        if(int.TryParse(lineArray[1],out score) && int.TryParse(lineArray[2],out totalPoints)) 
        { 
         var grade = new Grade(name: lineArray[0].Trim(), score: score, totalPoints: totalPoints); 
         gradeList.Add(grade); 
        }     
       } 
       return gradeList; 
      } 
     } 
    public sealed class Grade 
    { 
     public Grade(string name, int score, int totalPoints) 
     { 
      Name = name; 
      Score = score; 
      TotalPoints = totalPoints; 
     } 
     public string Name { get; } 
     public int Score { get; } 
     public int TotalPoints { get; } 
     public double Percentage() => Math.Round(Convert.ToDouble(Score)/Convert.ToDouble(TotalPoints),2); 
     public string GetLetterGrade() => Percentage().ToLetterGrade(); 
    } 
//and the use: 
     var csvString = File.ReadAllText(@"your path goes here"); 

     var currentGrades = CsvConverter.ToList(csvString); 

     var totalGrade = new Grade("Total", score: currentGrades.Sum(grade => grade.Score), totalPoints: currentGrades.Sum(grade => grade.TotalPoints)); 

     var reportCard = currentGrades.ToList(); 
     reportCard.Add(totalGrade); 

     var padding = 15; 

     Console.Write("".PadRight(padding) + "Score".PadRight(padding) + "Total Points".PadRight(padding) + "Percentage".PadRight(padding) + "Letter Grade".PadRight(padding) + Environment.NewLine); 

     foreach (var grade in reportCard) 
     { 
      Console.WriteLine(grade.Name.PadRight(padding) + grade.Score.ToString().PadRight(padding) + grade.TotalPoints.ToString().PadRight(padding) + grade.Percentage().ToString().PadRight(padding) + grade.GetLetterGrade().ToString().PadRight(padding) + Environment.NewLine); 
     } 

この情報が役立ちますようお願いいたします。

関連する問題