0

これは私の最初の質問の編集です。そのため、割り当てをもう一度確認しました。すべてのコードは私の教授が望んでいるように機能していますが、以前に尋ねた私の質問だけが私の問題です。- list[1].s.ShowGrade(0) を使用せずに list[1].ShowGrade(0) のように、リストから直接 ShowGrade メソッドを実行するにはどうすればよいですか?? ここにすべてのコードを配置します。Main の 2 つのコンソール行は彼が望むもの (および彼が望む方法) であり、課題に対する私の制約は次のとおりです。2. デフォルトのコンストラクター以外のコンストラクターはまったくありません。3. ShowGrade メソッドは Course クラスにはありません。4.ノーオペレーター。(ドット) ShowGrade では [] のみ 5. メソッド Q1 では 1 つのクエリのみになります。

私のコードは次のとおりです。

コース。cs:

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

namespace HW_1
{
    public class Course 
    {
        private delegate int Del(Course c);

        internal string courseName { get; set; }

        public  class Student
        {
            internal string stuName { get; set; }
            internal List<int> gradesList { get; set; }

            //internal int ShowGrade(int index)
            //{
            //    return gradesList[index];
            //}
        }

        internal Student s = new Student();

        public override string ToString()
        {
            string gr = null;
            foreach (var g in s.gradesList)
                gr += g + " ";
            return string.Format("{0, -6} {1, -14} {2, -10}", courseName, s.stuName, gr);
        }

    }
}

Program.cs :

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

namespace HW_1
{
    class Program
    {
        private delegate bool Del(Course c);

        static void Main(string[] args)
        {
            List<Course> list = new List<Course>
            { 
                new Course {courseName = "C#", s = new Course.Student {stuName = "Jojo", gradesList = new List<int>(){10, 20, 100}}},
                new Course {courseName = "C", s = new Course.Student {stuName = "Bambi", gradesList = new List<int>(){99}}},
                new Course {courseName = "Java", s = new Course.Student {stuName = "Bambi", gradesList = new List<int>(){}}}

            };

            Console.WriteLine("List of courses:");
            Print(list);

            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("Press P / p for students who passed in average 60 and those who didn't.");
            Console.WriteLine("");
            Console.WriteLine("Press # for C# courses and others.");
            Console.WriteLine("");
            Console.WriteLine("Press any other key for courses with student who have at least one grade of 100 and all oter courses.");

            char ch = (char)Console.Read();
            Del d = ((ch == 'P' || ch == 'p') ? (Del)(c => c.s.gradesList.Count > 0 && c.s.gradesList.Average() >= 60) : ((ch == '#') ? (Del)(c => c.courseName == "C#") : (Del)(c => c.s.gradesList.Contains(100))));

            var x = Q1 <IGrouping<bool, Course>>(list, d);
            Print(x);

            Console.WriteLine("");
            //Console.WriteLine(list[1].ShowGrade(0));
            //Console.WriteLine(list[2].ShowGrade(3));

        }

        static IEnumerable<T> Q1<T>(IEnumerable<Course> list, Del d)
        {
            var query =
                from c in list
                orderby d(c)
                group c by d(c) into g
                select g;

            return (IEnumerable<T>)query;
        }

        static void Print(IEnumerable<IGrouping<bool, Course>> list)
        {
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("Q1 Results:");
            foreach (var g in list)
            {
                Console.WriteLine();
                Console.WriteLine(g.Key);
                Console.WriteLine("---------------");
                foreach (var c in g)
                    Console.WriteLine(c);
            }
        }

        static void Print<T>(IEnumerable<T> list)
        {
            foreach (var l in list)
                Console.WriteLine(l);
        }



    }
}

2 つの Console.writeline の出力は次のようになります。

list[1].ShowGrade(0)
99
list[2].ShowGrade(3)
4

4 に答える 4

1

list[n] returns a Course, which has a Student property (one course can have one student?), from where you want to show the grade.

Your Student class needs this method:

public int ShowGrade(int index)
{
   return gradesList[index];
}

Then you can call:

list[n1].s.ShowGrade(n2);
于 2013-05-30T10:38:08.077 に答える
1

次のように公開されている学生のコースのリストがありますs

Console.Writeline(list[1].s.ShowGrade(0));

sしたがって、 のフィールドにアクセスする必要がありますlist[x]。ただし、パブリック フィールドの代わりにプロパティを使用することをお勧めします。

class Course
{
    internal string c_name {get; set;}
    public Student Student { get; private set; }

    public Course()
    {
        this.Student = new Student();
    }
}

実際には、非インナー クラスStudentとして作成することをお勧めします。内部クラスは、ローカルでのみ使用することになっています。

class Student
{
    internal s_name {get; set;}
    internal List<int> gradesList {get; set;}
}

Student内部クラスとして保持したい場合は、クラス外で使用するために作成するpublicCourse必要があります。

于 2013-05-30T10:37:41.650 に答える
0

問題があるため、コードを間違いなく修正する必要があります。

new Course ("C#", s.s_name = "Bob", s.gradesList = new List<int>(){100, 99, 85})

コンパイルされません。コンストラクターのパラメーターとオブジェクトの初期化を渡すことで混乱しているようです。

コンストラクタが使えない

オブジェクトの初期化をある程度使用することしかc_nameできません。たとえば、 is public を指定すると、次のことができます。

var course = new Course()
{
    c_name = "C#"
}

ただし、次のことはできません。

var course = new Course()
{
    s.gradeList = ...
}

これを手動で設定するだけです

var course = new Course()
{
    c_name = "C#"
};
course.s.gradeList = new List<int>() { ... }

ただし、あなたの質問に答えるために、ここで少しカプセル化を使用し、必要なコードを提供ShowGradeするクラスのメソッドを公開します。Course

Console.Writeline(list[1].ShowGrade(0));

内部的にCourseは、呼び出しを学生インスタンスに委任するだけです。

public int ShowGrade(int grade)
{
    return s.ShowGrade(grade);
}

ShowGradeクラスに追加できないと言ったことに気付きCourseました。その場合、 ieStudentからプロパティにアクセスするだけで済みますCourse

 list[0].s.ShowGrade(0);

ペニーはこれに落としたばかりです。次のようなコードが必要です。

list[0].ShowGrade(0);

ただし、クラスを変更することはできませんCourse- 唯一の代替手段は、拡張メソッドを使用することです。

public static class CourseExt
{
    public static int ShowGrade(this Course course, int grade)
    {
        return course.s.ShowGrade(grade);
    }
}
...
Console.WriteLine(list[0].ShowGrade(0));
于 2013-05-30T10:47:37.330 に答える
0

これがあなたが求めたコードです:

class Course
{
    internal string CourseName { get; set; }
    public Student s { get; set; }

    public class Student
    {
        internal string StudentName { get; set; }
        internal IEnumerable<int> GradesList { get; set; }

        public int ShowGrade(int index)
        {
            if (GradesList == null)
                throw new NullReferenceException();
            return GradesList.ElementAt<int>(index);
        }
    }
}


class Program
{
    static void Main(string[] args)
    {
        List<Course> list = new List<Course>()
    {
        new Course () { CourseName = "C#", 
            s =  new Course.Student() { StudentName = "Bob", 
                                                                            GradesList = new List<int>() { 100, 99, 85 }}},  
        new Course () { CourseName = "Java", 
            s =  new Course.Student() { StudentName = "Bobi", 
                                                                            GradesList = new List<int>(){ 99, 90, 88 }}},
        new Course (){ CourseName = "C", 
            s = new Course.Student() { StudentName = "Roni", 
                                                                            GradesList = new List<int>()}},
        new Course (){ CourseName = "SQL", 
            s = new Course.Student() { StudentName = "Sean", 
                                                                            GradesList = new List<int>(){ 75, 62, 55 }}}
    };
        Console.WriteLine(list[0].s.ShowGrade(1));

        Console.ReadKey();
    }
}
于 2013-05-30T10:56:08.730 に答える