2013-05-10 20 views
7

Tôi đang cố gắng sử dụng Danh sách tùy chỉnh là tôi đã thêm một vài công cụ bổ sung. Tôi muốn áp dụng danh sách này vào một danh sách dài các lớp tùy chỉnh mà tôi đã tạo. Tất cả các lớp đều có số ID và một số công cụ trong Danh sách sử dụng ID.Tạo và sử dụng Danh sách tùy chỉnh <T> trong C#

Đây là một phần mã của tôi mà tôi đang cố gắng sử dụng. Tôi hy vọng điều này giúp bạn hiểu được vấn đề của tôi.

namespace Simple_Point_of _Sales_System 
{ 
    public class MyList<T> : List<T> 
    { 
     internal int SetID() 
     { 
      return this.Max(n => n.ID) + 1; 
     } 
     internal T Find(int ID) 
     { 
      return this.Find(n => n.ID == ID); 
     } 
     internal T Add(T n) 
     { 
      Read(); 
      Add(n); 
      Write(); 
      return n; 
     } 
     internal void Remove(int ID) 
     { 
      Read(); 
      if (this.Exists(t => t.ID == ID)) RemoveAll(t => t.ID == ID); 
      else MessageBox.Show(GetType().Name + " " + ID + " does not exist.", "Missing Item", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Write(); 
     } 
     internal void Edit(int ID, T n) 
     { 
      Read(); 
      if (this.Exists(t => t.ID == ID)) this[FindIndex(t => t.ID == ID)] = n; 
      else MessageBox.Show(GetType().Name + " " + ID + " does not exist.", "Missing Item", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Write(); 
     } 
     internal MyList<T> Read() 
     { 
      Clear(); 
      StreamReader sr = new StreamReader(@"../../Files/" + GetType().Name + ".txt"); 
      while (!sr.EndOfStream) 
       Add(new T().Set(sr.ReadLine())); 
      sr.Close(); 
      return this; 
     } 
     internal void Write() 
     { 
      StreamWriter sw = new StreamWriter(@"../../Files/" + GetType().Name + ".txt"); 
      foreach (T n in this) 
       sw.WriteLine(n.ToString()); 
      sw.Close(); 
     } 
    } 

    public class Customer 
    { 
     public int ID; 
     public string FirstName; 
     public string LastName; 
    } 

    public class Item 
    { 
     public int ID { get; set; } 
     public string Category { get; set; } 
     public string Name { get; set; } 
     public double Price { get; set; } 
    } 

    public class MyClass 
    { 
     MyList<Customer> Customers = new MyList<Customer>(); 
     MyList<Item> Items = new MyList<Item>(); 
    } 
} 
+5

Vì danh sách tùy chỉnh của bạn chỉ giao dịch với Phòng tại sao bạn không tạo phòng: Danh sách thay thế? – ysrb

+1

Bạn nên sử dụng các ràng buộc trên 'T', vì vậy bạn hãy đảm bảo chỉ cho phép các lớp có trường' ''' hoặc thuộc tính. Tạo một Giao diện để thực thi điều này, nếu bạn không thể kế thừa. Nhưng bạn thực sự muốn biết điều gì? –

Trả lời

5

Tôi nghĩ danh sách tùy chỉnh của bạn cần đặt một số ràng buộc vào loại chung để cho phép điều đó. Tôi sẽ cập nhật chữ ký của bạn để một cái gì đó giống như

public class MyList<T> : List<T> where T : IIdentity { .... } 

Ở đây tôi sử dụng IIdentity như giao diện xác định ID, nhưng nó cũng có thể là một lớp.

Để cập nhật mã của bạn tôi sẽ làm một cái gì đó như thế này:

public interface IIdentity 
{ 
    int ID { get; } 
} 

public class Customer : IIdentity 
{ 
    public int ID { get; set;} 
    public string FirstName; 
    public string LastName; 
} 

public class Item : IIdentity 
{ 
    public int ID { get; set; } 
    public string Category { get; set; } 
    public string Name { get; set; } 
    public double Price { get; set; } 
} 

Tôi đã thay đổi ID trong Customer trở thành một tài sản thay vì biến ví dụ.

+0

Điều này dường như đang hoạt động. Cảm ơn bạn – Makai

+1

@Makai, nếu đó là câu trả lời cho câu hỏi của bạn, bạn nên đánh dấu câu trả lời là chính xác để giúp người khác. –