2015-12-07 184 views
2

我有兩個類,一個包含一個列表(Student),另一個是使用它的菜單程序(Program)。返回的列表不返回數據

當我從學生類返回列表時,它返回System.Collections.Generic.List'1[2015Assignment.StudentClass]

爲什麼數據沒有被返回?

它是建立在學生班級是這樣的:

namespace 2015Assignment 
{ 
    class StudentClass 
    { 
     private string StoredStudentName; 
     public List<StudentClass> GetName() 
     { 
      /*----------------------------------------------------------------------* 
      * Hard Programming the list of students        * 
      *----------------------------------------------------------------------*/ 
      List<StudentClass> ListOfStudents = new List<StudentClass>(); 
      ListOfStudents.Add(new StudentClass("Jane")); 
      ListOfStudents.Add(new StudentClass("Alex")); 
      ListOfStudents.Add(new StudentClass("Mike")); 
      ListOfStudents.Add(new StudentClass("James")); 
      ListOfStudents.Add(new StudentClass("Julia")); 
      return ListOfStudents; 
     } 

     public StudentClass(string StudentName) 
     { 
      StoredStudentName = StudentName; 
     } 
    } 
} 

並號召/寫入到Program類控制檯是這樣的:

StudentClass studentClass = new StudentClass(""); 
static void Main() 
    { 
     Program program = new Program(); 
     List<StudentClass> ListOfStudents = program.studentClass.GetName().ToList(); 
     ListOfStudents.ForEach(i => Console.WriteLine("{0}", i.GetName())); 
     Console.WriteLine("\r\nPress any key to continue..."); 
     Console.ReadKey(); 
    } 
+0

你可能有更多的標籤,你的問題,請 – AymericB

+0

通常情況下,你不寫'Class'在課程結束後.. 。 –

+1

你的'GetName'應該返回一個'string'(單個學生的名字)或者被重命名爲'GetAllStudents'。然而,即使您要返回一個'Student',您也需要重寫'ToString',然後'Console.WriteLine'會輸出您想要訪問私有財產,使StoredStudentName爲public並且學生的名字爲 –

回答

4

@Maxim Goncharuk is absolu關於你爲什麼看到System.Collections.Generic.List'1[2015Assignment.StudentClass]打印在控制檯上,請仔細檢查。您的GetName()方法返回List<StudentClass>,您會看到它的字符串表示形式。

我會重寫你的StudentClass爲:

internal class Student 
{ 
    public string Name { get; set; } 

    public Student(string name) 
    { 
     this.Name = name; 
    } 

    public static List<Student> GenerateStudents() 
    { 
     var students= new List<Student>(); 
     students.Add(new Student("Jane")); 
     students.Add(new Student("Alex")); 
     students.Add(new Student("Mike")); 
     students.Add(new Student("James")); 
     students.Add(new Student("Julia")); 
     return students; 
    } 
} 

幾個原因:

  • 你不應該包括類型信息到你的名字。因此,StudentClass應該只是Student
  • GetName()方法名稱不是生成數據的東西的好名字。混亂。
  • 您的情況下名稱不需要private字段。只需使用一個簡單的public屬性。如果你想阻止外部的代碼更改Name,只是使set訪問privatepublic string Name { get; private set; }
  • 沒有必要爲Student例如生成數據。 ,應使這種方法static

我也會重寫你的程序類,如下所示:

class Program 
{ 
    static void Main() 
    { 
     var students = Student.GenerateStudents(); 
     students.ForEach(i => Console.WriteLine("{0}", i.Name)); 

     Console.WriteLine("\r\nPress any key to continue..."); 
     Console.ReadKey(); 
    } 
} 

原因:

  • 我不明白爲什麼你需要保持一個StudentStudentClass在您的原始代碼中)的實例作爲您的Program類的一部分。局部變量適合更好,如果你只是想寫點東西到控制檯

  • 通常,實例化你的Program類不是一個好習慣。它應該成爲只是一個入口,你的應用程序,應該由框架只能使用

+0

感謝您的支持 - 這真的爲我清除了很多,以及來自@Maxim Goncharuk的答案。我對c#相當陌生,並且還沒有習慣標準和良好實踐,所以很抱歉讓大家都感到困惑! –

+0

@ B.Halsey沒問題。很高興這是有幫助的 –

2

你調用方法i.GetName()其返回List<StudentClass>Console.WriteLine致電ToString(),所以你有System.Collections.Generic.List'1[2015Assignment.StudentClass]

+2

和解決方案是? –

0

試試這個:

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

public class StudentClass 
{ 
    private string _storedStudentName; 
    public static List<StudentClass> GetStudents() 
    { 
     List<StudentClass> ListOfStudents = new List<StudentClass>(); 
     ListOfStudents.Add(new StudentClass("Jane")); 
     ListOfStudents.Add(new StudentClass("Alex")); 
     ListOfStudents.Add(new StudentClass("Mike")); 
     ListOfStudents.Add(new StudentClass("James")); 
     ListOfStudents.Add(new StudentClass("Julia")); 
     return ListOfStudents; 
    } 

    public string Name 
    { 
     get 
     { 
      return _storedStudentName; 
     } 
    } 

    public StudentClass(string StudentName) 
    { 
     _storedStudentName = StudentName; 
    } 
} 

計劃:

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

public class Program 
{ 
    public static void Main() 
    { 
     List<StudentClass> ListOfStudents = StudentClass.GetStudents(); 
     ListOfStudents.ForEach(i => Console.WriteLine("{0}", i.Name)); 
     Console.WriteLine("\r\nPress any key to continue..."); 
     Console.ReadKey(); 
    } 
} 
0

在你的代碼重構的幾件事情。你的代碼實際上並沒有做出很大的意義(或者也許它只是我)

//namespace can not start with a number 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //You need to define the list in your host program, not inside the class itself  
      List<StudentClass> ListOfStudents = new List<StudentClass>(); 
      ListOfStudents.Add(new StudentClass("Jane")); 
      ListOfStudents.Add(new StudentClass("Alex")); 
      ListOfStudents.Add(new StudentClass("Mike")); 
      ListOfStudents.Add(new StudentClass("James")); 
      ListOfStudents.Add(new StudentClass("Julia")); 


      ListOfStudents.ForEach(i => Console.WriteLine("{0}", i.GetName())); 
      Console.WriteLine("\r\nPress any key to continue..."); 
      Console.ReadKey(); 

     } 
    } 

    //changed the class to public so you can access it. 
    public class StudentClass 
    { 
     private string _storedStudentName; 

     public string GetName() 
     { 
      return _storedStudentName; 
     } 

     public StudentClass(string studentName) 
     { 
      _storedStudentName = studentName; 
     } 
    } 
}