2011-01-24 75 views
17

我有类foo的实例,我想将它作为IEnumerable返回。 我能做到,而无需创建一个新的列表等。作为IEnumerable返回单实例对象

也许类似以下内容:

IEnumerable<foo>.fromInstance(foo) 
+2

[传递单个项目为IEnumerable ](http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – nawfal 2013-02-17 12:19:42

+0

可能重复[将单个项目传递为IEnumerable ](https://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – 2017-06-22 18:11:16

回答

20

选项:

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

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

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

我有信心,Concat不会发生变异的阵列,而不是其他所见过的参考阵列本身。

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

12

最好的惯用方式做到这一点是一样的东西new[] { foo }刚刚创造的1个元素的数组不管什么类型foo被声明为是。

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

+0

简洁,干净。这应该是最重要的,并被接受。 +1 – data 2013-05-07 14:02:07

0

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

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

不管你怎么看,你实际上是试图让一个元素的列表,然后它真的没有理由让它一个列表。

+3

可能有很多理由将单个对象转换为IEnumerable。例如。有人可能想将它传递给一个期望IEnumerable的方法,或者它可以用来模拟Maybe monad等。 – 2011-01-24 07:20:16

17

你可以这样做:

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

我第二个这个响应;这种技术对枚举特定的成员变量也很有用。 – Apelsin 2013-05-07 18:34:03

相关问题