2010-09-02 180 views
8

我有一个类是IEnumerable<T>我想拥有不同的属性,提供过滤IEnumerable<T>访问。是否有可能拥有一个属性为IEnumerable <T>?

因此,例如:

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; 
     } 
    } 
} 

这是应该如何?只是不确定,关于它完全。

谢谢。

回答

11

当然,但你可能要重写它作为

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

这不完全一样的事情。

+0

+1表现力。 – Cumbayah 2010-09-02 18:58:30

+0

谢谢,是的,这在我的脑海里有点片面。现在我可以清楚地看到它。 – 2010-09-02 19:01:56

+0

WTG w/LINQ FTW。 – Randolpho 2010-09-02 21:20:52

2

当然,即使@ mquander的解决方案可能会更优雅一些,这应该可行(据我所见)。

1

这是有效的,但我认为是多余的。如果要公开形状的强类型列表:

public class Shape 
{ 

} 

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


} 

List<T>类实现IEnumerable。

+0

这样做的缺点是它会将您的列表暴露给外部影响。 – 2010-09-02 18:59:36

+0

您的第二个属性需要返回类型。 – 2010-09-02 19:14:55

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

您错过了get /括号使其成为方法。另外什么是Box,你的意思是ShapeType.Box?也可能将其重命名为OnlyBoxes,似乎更具描述性。

+0

没有人给我投票,我的名声就是这样。 – 2010-09-02 19:08:07

+0

谢谢我投票给你。我写了这样的代码,因为我没有使用VS,也不想写所有的东西。 – 2010-09-02 19:15:30

1

我个人认为你的OnlyBox属性是多余的。因为你的类的用户总是可以选择像下面那样使用Linq来获得相同的性能。所以,除非你可以做到这一点比LINQ的方法比较好,我觉得这是很好离开它的类象的用户:

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

但是,如果你想要的,而不是一个性质,:

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

你可以写:

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

谢谢,这个想法是因为这是简化的,但实际上过滤代码是非常丑陋的,因为这是一个非托管类的包装。所以想让它对用户和我自己来说更高一点。 – 2010-09-02 19:03:20

1

喜欢时尚更LINQ会提供你收集的方法:

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

或者只是有用户做一个Where子句:

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

否则,没有错的IEnumerable作为一个属性(记住性质应该是如此简单,他们很少会抛出异常)。

0

是的。你有什么是好的。如果你喜欢它的表现力,你可以转换为基于lambda的,虽然lambda版本可能有时性能较差(不是那么多,我会改变lambda版本为2.0的风格,除非它证明有问题,但足够,我wouldn除非它使lot更具表现力),否则将不会改变完美的2.0风格。

相关问题