将单个实例对象作为IEnumerable返回
我有类foo的例子,我想把它作为IEnumerable返回。 我可以在不创建新列表等的情况下完成此操作。
也许类似如下:
IEnumerable.fromInstance(foo)
选项:
- 创建集合类的实例,如数组或列表。 默认情况下这是可变的,如果这是您希望能够在API中分发的序列,那么这将是有点无益的。 您可以创建一个围绕这样的集合的
ReadOnlyCollection
包装器 。 - 根据Botz3000的答案编写自己的迭代器块
- 如果您使用的是.NET 3.5,请使用LINQ中的
Enumerable.Repeat(item, 1)
。
这里最好的答案取决于用法。 如果你只需要调用另一个使用序列的方法,并且你知道它不会被修改,我可能会使用一个数组。 例如,为了在其他序列上调用Concat
,您可能需要:
var wholeList = regularList.Concat(new[] { finalValue });
我相信Concat
不会改变数组,没有别的东西会看到对数组本身的引用。
如果你需要将序列返回到其他代码,并且你不知道它可以用它做什么,我可能会使用Enumerable.Repeat
。
你可以这样做:
public IEnumerable GetSingleFooAsEnumerable() { yield return singleFoo; }
执行此操作的最佳惯用方法是new[] { foo }
,它只是创建一个声明为foo
的任何类型的1元素数组。
这可能的一个缺点是数组不是不可变的,所以有人可以将你的IEnumerable
转换为T[]
并更改其中的值。 但这是不太可能的,所以我不担心。
IENumerable应该用于你可以枚举的东西,所以将它用于单个实例似乎很奇怪。 如果你真的需要,你可以像这样完成它。 这可能是一种更好的方法,但这应该完成工作:
List myList = new List (); myList.Add( myInstanceOfFoo ); IEnumerable myEnumerable = myList.AsEnumerable();
无论你如何看待这个,你实际上是在尝试列出一个元素,然后它真的没有理由把它作为一个列表。