带有类的 C# Lambda 表达式

Posted

技术标签:

【中文标题】带有类的 C# Lambda 表达式【英文标题】:C# Lambda expressions with Classes 【发布时间】:2018-12-09 23:01:01 【问题描述】:

我正在阅读一个包含学生列表的 csv - 姓名、姓氏、班长、年级、主题、分数。

如果他不存在,我想添加一个新学生,或者如果列表中存在该学生,我只添加主题和分数。代码如下:

   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;
        


    

我不断收到一条错误消息,提示无法转换“Student”类型的 lambda 表达式,因为它不是委托类型。

有人可以帮忙吗,我现在迷路了。

【问题讨论】:

我会先让我们知道哪一行给你这样的错误。 :) 我很抱歉。在类 School 方法 CreateStudents() 下一行: int i = Students.IndexOf(x => x.GetFullName().Contains(fullName)); 【参考方案1】:

由于您使用的是对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);


【讨论】:

非常感谢。这解决了这个问题。我被困在这个问题上一个多星期。再次感谢。【参考方案2】:

您似乎正在为 IndexOf 方法传递 Lambda 表达式,该方法仅支持 Item 而不是 Lambda。尝试使用 Lambda 获取 Student 并使用 Student 获取索引。

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

【讨论】:

以上是关于带有类的 C# Lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

C# Lambda表达式

C# Lambda

C# Lambda

lambda 表达式中的 C# 切换

C# 无法从 lambda 表达式中获取类属性值

C#使用左右连接创建3个表的lambda表达式