我有一个 foo 类的实例,并且希望将其作为 IEnumerable 返回。是否可以在不创建新列表等情况下完成?
也许可以尝试以下方法:
IEnumerable<foo>.fromInstance(foo)
我有一个 foo 类的实例,并且希望将其作为 IEnumerable 返回。是否可以在不创建新列表等情况下完成?
也许可以尝试以下方法:
IEnumerable<foo>.fromInstance(foo)
选项:
ReadOnlyCollection<T>
包装器来包装这样的集合。Enumerable.Repeat(item, 1)
,如果您正在使用.NET 3.5。最佳答案取决于用途。如果您仅仅需要调用另一个使用序列的方法,并且知道它不会被修改,我可能会使用数组。例如,为了调用另一个序列上的Concat
方法,您可能希望使用:
var wholeList = regularList.Concat(new[] { finalValue });
我相信Concat
不会改变数组本身的值,而且其他任何东西都不会看到对数组本身的引用。
如果你需要将序列返回给其他代码,并且不知道它可能会对序列做什么,我可能会使用Enumerable.Repeat
。
new [] { item }
- dataIEnumerable<T>
作为参数,那么可以安全地假设它不会改变序列吗?至少不会以任何使发送数组不安全的方式改变它吧? - Adrian Ratnapala你可以这样做:
public IEnumerable<Foo> GetSingleFooAsEnumerable() {
yield return singleFoo;
}
最佳的惯用方法是使用类似于 new[] { foo }
的方式,它只创建一个由类型为 foo
声明的元素组成的一维数组。
唯一可能的缺点是数组不是不可变的,因此有人可以将您的 IEnumerable<T>
强制转换为 T[]
并在其中更改值。虽然这种情况相当不太可能发生,但我不会担心它。
IEnumerable 应该用于可以枚举的内容,因此将其用于单个实例似乎相当奇怪。如果您确实需要这样做,可以像这样完成。可能有更好的方法,但这应该能完成工作:
List<foo> myList = new List<foo>();
myList.Add( myInstanceOfFoo );
IEnumerable myEnumerable = myList.AsEnumerable();