2017-09-14 1 views
-2

Sorry, wenn ich unklar war das Hauptproblem ist ich versuche, eine Funktion zu schreiben, die die Marken aus meiner CSV-Datei und berechnet sie eine Bewertung, die Unterseite Code-Snippet ist der Problemcode.C# Ich bekomme meine Funktion, um eine Note zu akzeptieren und eine Note zurückgeben

Ich habe einige Probleme hier, nach 5 Stunden Dokumentation und Experimenten bin ich ziemlich erschöpft und habe nur ein kleines bisschen Fortschritte gemacht. Ich bin im wahrsten Sinne des Wortes ein Neuling, da ich erst vor ein paar Wochen mit C# angefangen habe.

Das Problem in aller Kürze, ich habe eine kleine Anwendung geschrieben, die eine CSV-Datei lädt (die CSV-Datei enthält einen Namen und eine Markierung), dann mit StreamReader den Inhalt trennen und sie unter ihren eigenen Werten in einer Liste speichern

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

Klassen im gleichen Namensraum

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

Sobald ich meine Daten gespeichert werden verwaltet, begann ich versuche, eine Funktion zu schreiben, die MarksValue berechnet und dann eine Klasse zurückgibt auf der Grundlage der gespeicherten Marke in die CSV-Datei. Die Bewertungsparameter lauten: < 59 = Fehler, 60-78 = Kredit 79-89 = Unterscheidung, 90-100 = Auszeichnungen

Ein paar Dinge, die ich bisher versucht habe.

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; 

      */ 
     } 
    } 
} 

Versuchte es in Babysteps also zu tun, nur bekommen es die Klasse zu berechnen und eine Nachricht auf ihm drucken basiert, ist jede Hilfe ich danke Ihnen sehr geschätzt.

+3

Und wo ist dein Problem? –

+0

Entschuldigung, ich habe mich beworben, bevor ich die Post versehentlich ausgefüllt hatte. Problem ist, dass ich mich bemühe, eine Funktion zu schreiben, die Werte berechnet, die von meiner CSV-Datei in dem letzten Code Snippet gespeichert werden, sorry verwendete ich schlechte Formatierung? Zum ersten Mal habe ich hier gepostet, aber ich habe die FAQ gelesen. –

+0

Wenn Sie die Summe der Noten für jede Person berechnen möchten - dann sollten Sie vielleicht LINQ GroupBy & Sum als eine mögliche Lösung betrachten - siehe https://StackOverflow.com/questions/6970070/linq-Lambda-group- durch-mit-Summe. Beachten Sie, dass Sie den MarksValue als numerischen Wert lieber als eine Zeichenfolge speichern sollten. – PaulF

Antwort

0

Zunächst willkommen zu StackOverflow insbesondere und Programmierung im Allgemeinen.

Wir begannen alle irgendwo (obwohl wir vielleicht lieber vergessen). Ich werde nicht alles für dich schreiben, aber ich hoffe, dir ein paar Tipps geben zu können.

Angenommen, Ihre Marks ganze Zahlen sind, dann wenden Sie sich bitte an Ihre Marks Klasse ändern:

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

Wenn nun von der csv innerhalb der Schleife Lesen Sie verwenden müssen:

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

Sobald Sie haben Nach dem Lesen der Datei sind Sie bereit, die Summe zu erstellen. Was Sie dann brauchen, ist so etwas wie dieses:

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

Wenn Ihre Noten Dezimalzahlen sein kann, dann die Ints stattdessen in eine Dezimalzahl Typ verändern. Es gibt viele Versionen von Tryparse! Ich habe TryParse mit einbezogen, um Sie zu ermutigen, über Fehler nachzudenken. Im Allgemeinen sollten Sie Code in try .. catch Abschnitte enthalten.

Ich hoffe, das gibt Ihnen einen Anfang.

+0

Vielen Dank für Ihre aufschlussreichen Ratschläge und freundlichen Worte. Ich verstehe die Logik jetzt viel besser. –

0

Dies ist meine erste Antwort hier, da es meine Aufmerksamkeit auf sich zog, also dachte ich, dass ich es beantworten würde Ich habe gelesen, was Sie gefragt und was beantwortet wurde, aber ich dachte, dass ich meine 2 Cent in. Setzen würde Ich habe einige Annahmen gemacht, dass Sie einen Projektnamen, eine Punktzahl und totalPoints für diese Aufgabe haben würden. Ich habe ein paar Klassen mit dem Namen CsvConverter, Grade, LetterGrade erstellt. Ich wollte darauf hinweisen, weil es etwas gibt, das Separation Of Concerns heißt. So behalten Sie während der Entwicklung einer App eine saubere Struktur.

Dies ist eine Erweiterungsmethode, die Sie percentage.ToLetterGrade() sagen können, und es gibt die richtige Note zurück.

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

Ich hoffe, das hilft!

Verwandte Themen