2010-09-02 32 views
8

Tôi có một lớp học là IEnumerable<T> nơi tôi muốn có các thuộc tính khác nhau cung cấp quyền truy cập IEnumerable<T> được lọc.Có thể có thuộc tính IEnumerable <T> không?

Vì vậy, ví dụ:

class Shape 
    ShapeType = Box/Sphere/Pyramid 

class ShapeCollection : IEnumerable<Shape> 
{ 
    public IEnumerable<Shape> OnlyBox 
    { 
     foreach(var s in this) 
     { 
      if (s.ShapeType == Box) 
       yield return s; 
     } 
    } 
} 

Đây có phải là cách nó nên được? Chỉ cần không chắc chắn, về nó hoàn toàn.

Cảm ơn.

Trả lời

11

Chắc chắn, nhưng bạn có thể muốn viết lại nó như

public IEnumerable<Shape> OnlyBox 
{ 
    get { return this.Where(x => x.ShapeType == ShapeType.Box); } 
} 

mà làm điều tương tự.

+0

+1 cho tính biểu cảm. – Cumbayah

+0

Cảm ơn, vâng, điều này có một chút lúng túng trong đầu tôi. Bây giờ tôi có thể thấy rõ ràng. –

+0

WTG w/LINQ FTW. – Randolpho

2

Chắc chắn, điều đó sẽ hoạt động (theo như tôi có thể thấy) mặc dù giải pháp @ mquander có thể nhỏ hơn một chút.

1

Điều này hợp lệ, nhưng tôi nghĩ là thừa. Nếu bạn muốn hiển thị danh sách Hình dạng mạnh mẽ:

public class Shape 
{ 

} 

public class SomethingThatHasShapes 
{ 
    public List<Shape> Shapes { get; set; } 
    public Boxes 
    { 
     get { return Shapes.Where(s => s.ShapeType = ShapeType.Box); } 
    } 


} 

Thực hiện lớp List<T> IEnumerable.

+0

Nhược điểm của việc này là nó cho thấy danh sách của bạn với những ảnh hưởng bên ngoài. –

+0

Bạn cần loại trả lại trên thuộc tính thứ hai của mình. –

4
class ShapeCollection : IEnumerable<Shape> 
{ 
    public IEnumerable<Shape> OnlyBoxes 
    { 
     get { return this.Where(s => s.ShapeType == Box); } 
    } 
} 

Bạn đã bỏ lỡ get/dấu ngoặc đơn để làm cho nó trở thành phương thức. Ngoài ra, Box, ý của bạn là ShapeType.Box là gì? Cũng có thể đổi tên thành OnlyBoxes, có vẻ mô tả hơn.

+0

Không ai bỏ phiếu cho tôi, danh tiếng của tôi là tốt theo cách của nó. –

+0

Cảm ơn tôi đã bình chọn cho bạn. Tôi đã viết mã như vậy bởi vì tôi đã không sử dụng VS và không muốn viết toàn bộ điều. –

1

Cá nhân, tôi tin rằng thuộc tính OnlyBox của bạn là dư thừa. Vì người dùng của lớp của bạn sẽ luôn có tùy chọn sử dụng LINQ như sau với cùng hiệu suất. Vì vậy, trừ khi bạn có thể làm điều đó tốt hơn so với các phương pháp LINQ, tôi nghĩ rằng nó là tốt để lại nó cho người sử dụng của lớp như:

var filtered = shapeCol.Where(s => s.ShapeType == Box); 

Nhưng nếu bạn muốn có một tài sản, thay vì:

foreach(var s in this) 
{ 
    if (s.ShapeType == Box) 
     yield return s; 
} 

bạn có thể viết:

return this.Where(s => s.ShapeType == Box); 
+0

Cảm ơn, ý tưởng là vì điều này được đơn giản hóa nhưng trên thực tế, mã để lọc rất xấu vì đây là một trình bao bọc cho lớp không được quản lý. Vì vậy, muốn làm cho nó cao hơn một chút cho người dùng và bản thân tôi. –

1

một LINQ giống như thời trang sẽ được cung cấp một phương pháp để sưu tập của bạn:

public IEnumerable<Shape> Boxes() 
{ 
    return this.Where(ss => ss.ShapeType == ShapeType.Box); 
} 

Hoặc chỉ cần có người làm một điều khoản đó:

// gather boxes 
var query = from shape in shapes 
      where shape.ShapeType == ShapeType.Box 
      select shape; 

Nếu không, không có gì sai với IEnumerable như một thuộc tính (giữ trong thuộc tính tâm nên quá đơn giản họ hiếm khi ném ngoại lệ).

0

Đúng. Những gì bạn có là tốt. Bạn có thể chuyển đổi thành lambda dựa trên nếu bạn thích tính biểu cảm của nó, mặc dù phiên bản lambda có thể đôi khi ít hoạt động hơn (không quá nhiều đến mức tôi muốn thay đổi phiên bản lambda thành 2.0) trừ khi nó có vấn đề. 't thay đổi một phong cách 2.0 hoàn hảo tốt để dựa trên lambda trừ khi nó làm cho nó một biểu cảm hơn).

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