将单个实例对象作为IEnumerable返回

时间:2011-01-24 06:58:23

标签: c# casting ienumerable

我有类foo的例子,我想把它作为IEnumerable返回。 我可以在不创建新列表的情况下这样做。

可能类似以下内容:

IEnumerable<foo>.fromInstance(foo)

4 个答案:

答案 0 :(得分:21)

选项:

  • 创建集合类的实例,如数组或列表。默认情况下这是可变的,如果这是您希望能够在API中分发的序列,那么这将是有点无益的。您可以围绕此类集合创建ReadOnlyCollection<T> 包装
  • 根据Botz3000的回答编写您自己的迭代器块
  • 如果您使用的是.NET 3.5,请使用LINQ中的Enumerable.Repeat(item, 1)

这里最好的答案取决于用法。如果需要这个来调用另一个使用序列的方法,并且你知道它不会被修改,我可能会使用一个数组。例如,为了在其他序列上调用Concat,您可能需要:

var wholeList = regularList.Concat(new[] { finalValue });

我相信Concat不会改变数组,没有别的东西会看到对数组本身的引用。

如果您需要将序列返回到其他代码,并且您不知道它可能对它做什么,我可能会使用Enumerable.Repeat

答案 1 :(得分:17)

你可以这样做:

public IEnumerable<Foo> GetSingleFooAsEnumerable() { 
    yield return singleFoo;
}

答案 2 :(得分:13)

执行此操作的最佳惯用方法是new[] { foo },它只创建一个声明为foo类型的1元素数组。

这可能的一个缺点是数组不是不可变的,所以有人可以将IEnumerable<T>转换为T[]并更改其中的值。但这是不太可能的,所以我不担心。

答案 3 :(得分:0)

IENumerable应该用于你可以枚举的东西,所以将它用于单个实例似乎很奇怪。如果你真的需要,你可以像这样完成它。这可能是一种更好的方法,但这应该可以完成工作:

List<foo> myList = new List<foo>();
myList.Add( myInstanceOfFoo );
IEnumerable myEnumerable = myList.AsEnumerable();

无论你如何看待这个,你实际上是在尝试列出一个元素,然后它真的没有理由把它作为一个列表。