2012-12-04 3 views
-1

학생 및 주제 세부 정보를 얻기 위해 지그재그 배열이 있습니다. 학생 세부 정보 (이름 및 롤로)와 대상 세부 정보 (제목 및 표시)에 대해 각각 2 개의 지그재그 형 배열을 사용했습니다. 이제는 특정 학생의 모든 점수를 합산하기를 원합니다. 누군가가 어떻게 저에게 갈 수 있는지 알려줄 수 있습니까? 아래는 제 전체 코드입니다.들쭉날쭉 한 배열의 값을 합산합니다.

public void GetStudentDetails() 
     { 

      Console.WriteLine("Please enter number of Students"); 
      int STUDENTS = Convert.ToInt32(Console.ReadLine()); 
      Console.WriteLine("Please enter number of Subjects"); 
      int SUBJECTS = Convert.ToInt32(Console.ReadLine()); //0 is reserved for the student name, so the marks starts from the index 1, hence if you set the marks for 3, it will ask for 2 marks 


      string[][] student_details = new string[STUDENTS][]; 
      string[][] subject_details = new string[SUBJECTS][]; 
      string[][] result_details = new string[STUDENTS][]; 

      StringBuilder stud_sub_info = new StringBuilder(); 
      stud_sub_info.Append("Name\tRoll-No\t"); 
      for (int a = 0; a < STUDENTS; a++) 
      { 
       student_details[a] = new string[STUDENTS * 2]; 
       for (int b = 0; b < 2; b++) 
       { 
        Console.WriteLine("Enter Student {0} {1}:", a + 1, (b == 0) ? "Name" : "Roll-No"); 
        student_details[a][b] = Console.ReadLine(); 
       } 
       for (int c = 0; c < SUBJECTS; c++) 
       { 
        subject_details[c] = new string[SUBJECTS * 2]; 
        for (int d = 0; d < 2; d++) 
        { 
         if (d == 0) 
         { 
          Console.WriteLine("Enter Name for Subject {0}", c + 1); 
          subject_details[c][d] = Console.ReadLine(); 
          stud_sub_info.Append(subject_details[c][d] + "\t"); 
         } 
         else 
         { 
          Console.WriteLine("Enter Marks for {0}", subject_details[c][d - 1]); 
          subject_details[c][d] = Console.ReadLine(); 
         } 
        } 
       } 
      } 
      Console.WriteLine(stud_sub_info.ToString()); 
      for (int a = 0; a < STUDENTS; a++) 
      { 
       for (int b = 0; b < 2; b++) 
       { 
        Console.Write(student_details[a][b] + "\t"); 
       } 
       for (int c = 0; c < SUBJECTS; c++) 
       { 
        for (int d = 0; d < 2; d++) 
        { 
         Console.Write(subject_details[c][d] + "\t"); 
        } 
       } 
      } 
     } 

답변

1

같은 그런 Linq에 문 나는 확실히 이와 같은 들쭉날쭉 한 배열을 사용하지 않을 것이다. 그것은 어려운 코딩을 만듭니다.

예를 들어, 코드에서 각 학생의 제목 표시를 캡처하지만 이전 학생의 데이터는 지울 때 사용합니다. subject_details 지그재그 배열에는 학생용 색인이 없습니다. 데이터를 효과적으로 덮어 씁니다. 배열을 string[][][]으로 선언해야합니다.

가 여기에 간단하게 코드,의, 그 작동합니다 :

string[][] student_details = new string[STUDENTS][]; 
string[][][] subject_details = new string[STUDENTS][][]; 
string[][] result_details = new string[STUDENTS][]; 

for (int a = 0; a < STUDENTS; a++) 
{ 
    student_details[a] = new string[STUDENTS * 2]; 
    subject_details[a] = new string[SUBJECTS][]; 
    Console.WriteLine("Enter Student {0} {1}:", a + 1, "Name"); 
    student_details[a][0] = Console.ReadLine(); 
    Console.WriteLine("Enter Student {0} {1}:", a + 1, "Roll-No"); 
    student_details[a][1] = Console.ReadLine(); 
    for (int c = 0; c < SUBJECTS; c++) 
    { 
     subject_details[a][c] = new string[SUBJECTS * 2]; 
     Console.WriteLine("Enter Name for Subject {0}", c + 1); 
     subject_details[a][c][0] = Console.ReadLine(); 
     Console.WriteLine("Enter Marks for {0}", subject_details[a][c][0]); 
     subject_details[a][c][1] = Console.ReadLine(); 
    } 
} 
for (int a = 0; a < STUDENTS; a++) 
{ 
    Console.Write(student_details[a][0] + "\t"); 
    Console.Write(student_details[a][1] + "\t"); 
    for (int c = 0; c < SUBJECTS; c++) 
    { 
     Console.Write(subject_details[a][c][0] + "\t"); 
     Console.Write(subject_details[a][c][1] + "\t"); 
    } 
} 

이제 당신의 숫자가 아닌 항목에 대한 허용하는 것이 우리가 모든 학생이 과목의 동일한 번호가하는 사실 있다는 것을 무시 주어진 및 제목 점수를 사용하면 다음 LINQ 쿼리를 사용하여 들쭉날쭉 한 배열을 실행 가능한 것으로 바꿀 수 있습니다.

var query = 
    from i in Enumerable.Range(0, STUDENTS) 
    let Name = student_details[i][0] 
    let RollNo = student_details[i][1] 
    let Subjects = (
     from j in Enumerable.Range(0, SUBJECTS) 
     let Subject = subject_details[i][j][0] 
     let Marks = int.Parse(subject_details[i][j][1]) 
     select new { Subject, Marks } 
    ) 
    select new { Name, RollNo, Subjects }; 

이 나에게 다음과 같다 구조를 제공합니다

var results = 
    query 
     .Select(x => new 
     { 
      x.Name, 
      TotalMarks = x.Subjects.Sum(y => y.Marks) 
     }); 

그리고 지금이 모양 : 당신의 총 점수를 얻기 위해이 쿼리를 사용할 수 있습니다 지금

query data structure

:

total marks

+0

귀하의 코드는 매력처럼 작동했지만, 작은 변화 student_details [STUDENT * 2]와 subject_details [SUBJECT * 2]는 필요하지 않습니다. 두 경우 모두 (* 2)는 필요하지 않습니다. 괜찮아요, 그리고 가장 좋은 부분은 그때 내 깔끔한 것입니다. – Abbas

2

이렇게하면 지그재그 배열 대신 Linq, Collections 및 클래스를 만드는 것이 훨씬 쉬울 것입니다. 이렇게하면 1 명의 학생을 여러 코스에 묶을 수 있으며 각 코스에는 많은 과제가 있습니다. 다음

Sum(x => x.StudentGrade) 

가 나는 금액으로 무엇을 할 수 있는지의 아이디어를 얻을 단지로 시작 될지의 스텁 사본, 그리고 기타 정보 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace StudentManagement { 
    public class Student { 

    public static void Main(string[] args) { 
     List<Student> students = new List<Student>(); 

     Console.Write("Enter number of students: "); 
     int numStudents = int.Parse(Console.ReadLine()); 

     for (int i = 0; i < numStudents; i++) { 
     Student s = new Student(); 
     students.Add(s); 
     } 

     Console.Write("Press any key to continue..."); 
     Console.ReadKey(true); 
    } 

    public string FirstName { get; set; } 
    public List<Course> Courses { get; set; } 

    public Student() { 
     this.Courses = new List<Course>(); 

     Console.Write("Enter First Name: "); 
     this.FirstName = Console.ReadLine(); 

     Console.Write("Enter in number of courses: "); 
     int numCourses = int.Parse(Console.ReadLine()); 

     for (int i = 0; i < numCourses; i++) { 
     Course course = new Course(); 
     this.Courses.Add(course); 
     } 

    } 
    } 

    public class Course { 
    public string Title { get; set; } 
    public string Code { get; set; } 
    public string Section { get; set; } 
    public List<Assignment> Assignments { get; set; } 

    public Course() { 
     this.Assignments = new List<Assignment>(); 

     // Set Title, Code, Section 
     Console.Write("Enter nuber of assignments: "); 
     int numAssignments = int.Parse(Console.ReadLine()); 

     for (int i = 0; i < numAssignments; i++) { 
     Assignment assignment = new Assignment(); 
     this.Assignments.Add(assignment); 
     } 

    } 
    } 

    public class Assignment { 
    public string Name { get; set; } 
    public double MaxGrade { get; set; } 
    public double StudentGrade { get; set; } 

    public Assignment() { 
     // Prompt for Name, MaxGrade, StudentGrade 
    } 
    } 
} 
+0

나는 배열에 무거운 코드가 이해하는데 5 분이 걸렸고 건설적인 대답을 구성하기에 충분한 에너지가 있는지를 결정하는 데 또 5 분이 걸렸습니다. +1. –

+0

재밌는 점은 우리 학생들은 컬렉션과 Linq를 통해 소유권 체인을 할 때 수업에서 2 주 전에이 과제를 수행했기 때문입니다. –

+0

@Damon : 사용자가 입력을 받아들이는 루프가 어떻게 진행되는지 말해 줄 수 있다면 마음에 들지 않으면 코드가 성능을 최적화한다고 생각합니다. – Abbas

관련 문제