【发布时间】:2011-06-14 08:19:22
【问题描述】:
我有类 foo 的实例,我想将它作为 IEnumerable 返回。 我可以在不创建新列表等的情况下做到这一点吗?
可能类似于以下内容:
IEnumerable<foo>.fromInstance(foo)
【问题讨论】:
标签: c# casting ienumerable
我有类 foo 的实例,我想将它作为 IEnumerable 返回。 我可以在不创建新列表等的情况下做到这一点吗?
可能类似于以下内容:
IEnumerable<foo>.fromInstance(foo)
【问题讨论】:
标签: c# casting ienumerable
执行此操作的最佳惯用方法是类似于 new[] { foo },它只创建一个声明为 foo 的任何类型的 1 元素数组。
这样做的一个可能的缺点是数组不是不可变的,因此有人可以将您的 IEnumerable<T> 转换为 T[] 并更改其中的值。不过,这不太可能,所以我不担心。
【讨论】:
选项:
ReadOnlyCollection<T> 包装器。Enumerable.Repeat(item, 1)。这里的最佳答案取决于使用情况。如果你只需要它来调用另一个使用序列的方法,并且你知道它不会被修改,我可能会使用一个数组。例如,为了在其他序列上调用Concat,您可能需要:
var wholeList = regularList.Concat(new[] { finalValue });
我有信心Concat 不会改变数组,其他任何东西都不会看到对数组本身的引用。
如果您需要将序列返回给其他代码,并且您不知道它可能会做什么,我可能会使用Enumerable.Repeat。
【讨论】:
new [] { item }
IEnumerable<T> 作为参数,那么假设它不会改变序列是否安全?至少不要在任何意义上对其进行变异,这会使发送数组变得不安全?
你可以这样做:
public IEnumerable<Foo> GetSingleFooAsEnumerable() {
yield return singleFoo;
}
【讨论】:
IENumerable 应该用于您可以枚举的东西,因此将它用于单个实例似乎很奇怪。如果你真的需要,你可以像这样完成它。这可能是一个更好的方法,但这应该可以完成工作:
List<foo> myList = new List<foo>();
myList.Add( myInstanceOfFoo );
IEnumerable myEnumerable = myList.AsEnumerable();
不管你怎么看,你实际上是在尝试制作一个包含一个元素的列表,然后真的没有理由让它成为一个列表。
【讨论】: