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

Adi*_*be7 17 c# ienumerable casting

我有类foo的例子,我想把它作为IEnumerable返回.我可以在不创建新列表的情况下执行此操作.

也许类似如下:

IEnumerable<foo>.fromInstance(foo)
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 21

选项:

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

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

var wholeList = regularList.Concat(new[] { finalValue });
Run Code Online (Sandbox Code Playgroud)

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

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


Bot*_*000 17

你可以这样做:

public IEnumerable<Foo> GetSingleFooAsEnumerable() { 
    yield return singleFoo;
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*abe 14

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

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