2011-11-19 33 views
9

Thuộc tính của tập hợp Bộ sưu tập như thế nào?C# nhận và đặt thuộc tính cho Bộ sưu tập danh sách

Tôi đã tạo một lớp học có thuộc tính Bộ sưu tập. Tôi muốn thêm vào Danh sách bất cứ lúc nào tôi đặt một giá trị mới. Sử dụng _name.Add (giá trị) trong phương thức set không hoạt động.

Section newSec = new Section(); 

newSec.subHead.Add("test string"); 
newSec.subHead.Add("another test string"); 

public class Section 
{ 
    public String head { get; set; } 
    private List<string> _subHead = new List<string>(); 
    private List<string> _content = new List<string>(); 

    public List<string> subHead 
    { 
     get 
     { return _subHead; } 
     set 
     { 
      _subHead.Add(value); 
     } 
    } 
    public List<string> content 
    { 
     get 
     { return _content; } 
     set 
     { 
      _content.Add(value); 
     } 
    } 
} 

Cập nhật với các giải pháp của tôi:

public class Section 
{ 

    private List<string> _head = new List<string>(); 
    private List<string> _subHead = new List<string>(); 
    private List<string> _content = new List<string>(); 

    public List<string> Head 
    { 
     get 
     { return _head; } 
    } 

    public List<string> SubHead 
    { 
     get 
     { return _subHead; } 
    } 
    public List<string> Content 
    { 
     get 
     { return _content; } 
    } 

    public void AddHeading(string line) 
    { 
     Head.Add(line); 
    } 

    public void AddSubHeading(string line) 
    { 
     SubHead.Add(line); 
    } 

    public void AddContent(string line) 
    { 
     Content.Add(line); 
    } 

} 

Trả lời

17

Nó sẽ là không thích hợp cho nó trở thành một phần của setter - nó không giống như bạn đang thực sự thiết lập toàn bộ danh sách các chuỗi - bạn' chỉ đang cố gắng thêm một.

Có một vài lựa chọn:

  • Đặt AddSubheadingAddContent phương pháp trong lớp học của bạn, và chỉ lộ read-only phiên bản của danh sách
  • Phơi bày danh sách có thể thay đổi chỉ với thu khí, và để cho người gọi thêm đối với họ
  • hãy từ bỏ tất cả hy vọng của đóng gói, và chỉ làm cho họ đọc/ghi thuộc tính

trong trường hợp thứ hai, mã của bạn có thể thể chỉ:

public class Section 
{ 
    public String Head { get; set; } 
    private readonly List<string> _subHead = new List<string>(); 
    private readonly List<string> _content = new List<string>(); 

    // Note: fix to case to conform with .NET naming conventions 
    public IList<string> SubHead { get { return _subHead; } } 
    public IList<string> Content { get { return _content; } } 
} 

Đây là hợp lý đang thực dụng, mặc dù nó không có nghĩa là những người gọi có thể đột biến bộ sưu tập của bạn bất kỳ cách nào họ muốn, mà có thể không được lý tưởng. Cách tiếp cận đầu tiên giữ quyền kiểm soát nhiều nhất (chỉ mã của bạn từng thấy danh sách có thể thay đổi) nhưng có thể không thuận tiện cho người gọi.

Đặt bộ sưu tập của một loại bộ sưu tập thực sự chỉ thêm một phần tử vào bộ sưu tập hiện tại là không khả thi cũng không dễ chịu, vì vậy tôi khuyên bạn nên từ bỏ ý tưởng đó.

+0

Cảm ơn sự giúp đỡ của bạn! Tôi đã thử đi với cánh cửa số 1. – SharpBarb

0

Người định cư của bạn là lạ, đó là lý do tại sao bạn có thể gặp sự cố.

Thứ nhất, xem xét liệu bạn thậm chí không cần những setters - nếu như vậy, họ nên tham gia một List<string>, không chỉ là một string:

set 
{ 
    _subHead = value; 
} 

Những dòng:

newSec.subHead.Add("test string"); 

đang kêu gọi các phương thức getter và sau đó gọi Add trên trả lại List<string> - trình setter không được gọi.

4

Nếu tôi hiểu yêu cầu của bạn một cách chính xác, bạn phải làm như sau:

public class Section 
{ 
    public String Head 
    { 
     get 
     { 
      return SubHead.LastOrDefault(); 
     } 
     set 
     { 
      SubHead.Add(value); 
     } 

    public List<string> SubHead { get; private set; } 
    public List<string> Content { get; private set; } 
} 

Bạn sử dụng nó như thế này:

var section = new Section(); 
section.Head = "Test string"; 

Now "Kiểm tra chuỗi" được bổ sung vào bộ sưu tập đầu đề và sẽ có sẵn thông qua getter:

var last = section.Head; // last will be "Test string" 

Hy vọng tôi đã hiểu chính xác bạn.

+1

+1 vì mặc dù LastOrDefault có lẽ không phải là câu trả lời đúng, nhưng tôi không biết phương pháp đó tồn tại, vì vậy hôm nay tôi đã học được điều gì đó và tất cả đều tốt. –

+6

Không công bằng, tôi không có cơ hội chống lại Skeet: D – LueTm

+0

@LueTm, tại sao bạn xác định SubHead công khai? –

3

Hoặc

public class Section 
{ 
    public String Head { get; set; } 
    private readonly List<string> _subHead = new List<string>(); 
    private readonly List<string> _content = new List<string>(); 

    public IEnumerable<string> SubHead { get { return _subHead; } } 
    public IEnumerable<string> Content { get { return _content; } } 

    public void AddContent(String argValue) 
    { 
    _content.Add(argValue); 
    } 

    public void AddSubHeader(String argValue) 
    { 
    _subHead.Add(argValue); 
    } 
} 

Tất cả phụ thuộc vào bao nhiêu implementaton nội dung và tiêu đề phụ mà bạn muốn ẩn.

Các vấn đề liên quan