我有一个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;
}
}
}
这是怎么回事?只是不确定,完全是这样。
感谢。
答案 0 :(得分:11)
当然可以,但您可能希望将其重写为
public IEnumerable<Shape> OnlyBox
{
get { return this.Where(x => x.ShapeType == ShapeType.Box); }
}
完全相同。
答案 1 :(得分:4)
class ShapeCollection : IEnumerable<Shape>
{
public IEnumerable<Shape> OnlyBoxes
{
get { return this.Where(s => s.ShapeType == Box); }
}
}
您错过了get
/括号以使其成为一种方法。另外什么是Box
,你的意思是ShapeType.Box
?也可以将其重命名为OnlyBoxes
,似乎更具描述性。
答案 2 :(得分:2)
当然,即使@mquander的解决方案可能更优雅,这应该可行(据我所见)。
答案 3 :(得分: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。
答案 4 :(得分: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);
答案 5 :(得分: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作为属性没有任何问题(记住属性应该如此简单,他们很少抛出异常)。
答案 6 :(得分:0)
是的。你有什么是好的。你可以转换为基于lambda的,如果你更喜欢它的表现力,虽然lambda版本有时性能较差(不是说我将lambda版本更改为2.0样式,除非它证明有问题,但足够的是我不会将完美的2.0风格改为基于lambda的风格,除非它使很多更具表现力。)