2013-03-12 139 views
0

我有一个任务来创建一个类Student并创建一个方法,只有当他们的名字在他们的姓氏之前按字母顺序使用LINQ查询操作符从数组中挑选学生。我已经写了Student类:无法隐式转换类型错误

public class Student 
{ 
    private string firstName; 
    private string familyName; 
    private int age; 

    public Student(string firstName, string familyName, int age) 
     : this() 
    { 
     this.firstName = firstName; 
     this.familyName = familyName; 
     this.age = age; 
    } 

    public Student() 
    { 
     firstName = "Dancho"; 
     familyName = "Mastikata"; 
     age = 24; 
     this.firstName = firstName; 
     this.familyName = familyName; 
     this.age = age; 
    } 

    public string FirstName 
    { 
     get { return firstName; } 
     set { firstName = value; } 
    } 

    public string FamilyName 
    { 
     get { return familyName; } 
     set { familyName = value; } 
    } 

    public int Age 
    { 
     get { return age; } 
     set { age = value; } 
    } 
} 

然后我编码这一个:

public class StudentsManipulations 
{ 
    static void Main() 
    { 
     Student[] students = new Student[6]{new Student("Georgi", "Milanov", 21  ), 
              new Student("Ilko", "Pirgov", 30  ), 
              new Student("Neboisha", "Yelenkovich", 34), 
              new Student("Dimitar", "Berbatov", 32 ), 
              new Student(       ), 
              new Student("Nikolai", "Bodurov", 24 )}; 

    } 

    public static List<Student> StudentSortByFirstName(Student[] students) 
    { 
     List<Student> sortedStudents = from student in students 
      where student.FirstName.CompareTo(student.FamilyName) < 0 
      select student; 

     return sortedStudents; 
    } 
}    

不幸的是,在关键字的错误,我不能完全理解:

无法将类型 'System.Collections.Generic.IEnumerable'隐式转换为 'System.Collections.Generic.List'。存在明确转换 (您是否缺少演员?)。

你能帮我理解究竟是什么错误吗?

+3

我喜欢你的伟大的BG足球运动员名单:) – EkoostikMartin 2013-03-12 13:29:59

+0

感谢您的帮助 - 每个人! – 2013-03-12 16:45:32

回答

9

使用ToList()方法枚举结果,并把它们放入一个列表:

var query = from student in students 
      where student.FirstName.CompareTo(student.FamilyName) < 0 
      select student; 

List<Student> sortedStudents = query.ToList(); 

或者在一个声明:

List<Student> sortedStudents = (from student in students 
           where student.FirstName.CompareTo(student.FamilyName) < 0 
           select student).ToList(); 
+0

这是一个匿名类型吗? – 2013-03-12 13:30:34

+0

不,'var'表示一个隐式类型的局部变量。阅读此参考资料:http://msdn.microsoft.com/en-us/library/bb383973.aspx – MarcinJuraszek 2013-03-12 13:31:49

1

你应该在你的声明的末尾添加.ToList()

这种转换的可枚举到一个列表

2

你只需要您的LINQ表达式转换到一个列表:

List<Student> sortedStudents = (from student in students 
where student.FirstName.CompareTo(student.FamilyName) < 0 select student).ToList(); 
3

你的错误意味着你的流利的LINQ是返回一个IEnumerable<Student>,而不是List<Student>你期望。您需要拨打另外的电话.ToList(),或者您可以使用IEnumerable<Student>

1

添加.ToList()到您的查询:

List<Student> sortedStudents = (from student in students where student.FirstName.CompareTo(student.FamilyName) < 0 select student).Tolist(); 
2

这个查询,

from student in students 
where student.FirstName.CompareTo(student.FamilyName) < 0 
select student 

返回IEnumerable<Student>

如果你想有一个List<Student>,那么你应该对所得到的IEnumerable<Student>拨打ToList()

List<Student> sortedStudents = 
    (from student in students 
    where student.FirstName.CompareTo(student.FamilyName) < 0 
    select student) 
    .ToList(); 

注意,作为一般规则,LINQ查询进行评估时,结果被枚举,而不是之前(这称为“懒惰执行”或“延迟加载”)。然而,调用ToList()将立即执行查询,枚举结果并填充列表。

相关问题