C # лямбда-выражения с классами - PullRequest
0 голосов
/ 01 июля 2018

Я читаю CSV со списком студентов - Имя, Фамилия, ClassLeader, Оценка, Тема, Оценка.

Я хочу добавить нового ученика, если он не существует, или добавить предмет и оценку, только если ученик существует в списке. Код ниже:

   class School
    {
        private int[] Grades = new int[5] { 8, 9, 10, 11, 12 };
        public List<Student> Students = new List<Student>();
        private HashSet<string> AllSubjects = new HashSet<string>();

        public School()
        {

        }

        public void CreateStudents()
        {                
            List<string[]> storedCSVData = CSVHelper.ReadCSV();
            //int index = 0;

            foreach(string[] lineItem in storedCSVData)
            {
                //index++;
                //if ((index % 6) != 0)
                //    continue;
                string fullName = lineItem[0] + " " + lineItem[1];

                int i = Students.IndexOf(x =>  
                x.GetFullName().Contains(fullName));

                    if(i >= 0){
                    Students[i].SubjectScore.Add(lineItem[4], 

                    Convert.ToDouble(lineItem[5]));
                        continue;
                    }                         

                    Student storedStudent = new Student(lineItem[0],
                                                        lineItem[1],
                                                        lineItem[2] == "Yes" 
                                                        `? true : false,`

                   Convert.ToInt32(lineItem[3]));

                    Students.Add(storedStudent);

            }

            foreach(Student s in Students)
            Console.WriteLine(s.GetFullName());

        }
    }

}

В классе ученика:

    class Student : Person
    {
        private bool ClassLeader = false;
        private int Grade = 0;
        public Dictionary<string, double> SubjectScore = new 
                                          Dictionary<string, double>();


        public Student(string name, string surname, bool classLeader, int 
                       grade)
        {
            Name = name;
            Surname = surname;
            ClassLeader = classLeader;
            Grade = grade;
        }

        public string GetFullName()
        {
            return Name + " " + Surname;
        }


    }

Я получаю сообщение об ошибке «Не удается преобразовать лямбда-выражение типа« Студент », потому что это не тип делегата.

Может кто-нибудь, пожалуйста, помогите с этим, я в настоящее время потерян.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Поскольку вы используете ссылку на Student, поиск по списку, а затем получение index не имеет смысла. В любом случае вы используете Student экземпляр, поэтому используйте LINQ FirstOrDefault и получите объект, который вы пытаетесь изменить (в данном случае, чтобы изменить SubjectScore).

Вы бы предпочли:

foreach(string[] lineItem in storedCSVData)
{

    string fullName = lineItem[0] + " " + lineItem[1];

    //Get student instance instead of index, since you would use it anyway
    Student student = Students.FirstOrDefault(s => s.GetFullName().Contains(fullName));

    //If there is no result, FirstOrDefault returns 'null'
    if(student != null)
    {
        //Add using refernce instead of using index
        student.SubjectScore.Add(
            lineItem[4], 
            Convert.ToDouble(lineItem[5]));
        continue;
    }                         

    Student storedStudent = new Student(lineItem[0],
                                        lineItem[1],
                                        lineItem[2] == "Yes" ? true : false,
                                        Convert.ToInt32(lineItem[3]));

    Students.Add(storedStudent);

}
0 голосов
/ 01 июля 2018

Похоже, вы передаете лямбда-выражение для IndexOf метода, который поддерживает только элемент вместо лямбда-выражения. Попробуйте получить Student с помощью лямбды и используйте Student для получения индекса.

Student student = Students.FirstOrDefault(x => x.GetFullName().Contains(fullName));
int i = Students.IndexOf(student);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...