【问题标题】:return single instance object as IEnumerable将单个实例对象返回为 IEnumerable
【发布时间】:2011-06-14 08:19:22
【问题描述】:

我有类 foo 的实例,我想将它作为 IEnumerable 返回。 我可以在不创建新列表等的情况下做到这一点吗?

可能类似于以下内容:

IEnumerable<foo>.fromInstance(foo)

【问题讨论】:

标签: c# casting ienumerable


【解决方案1】:

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

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

【讨论】:

  • 简短、简洁、干净。这应该放在首位并被接受。 +1
【解决方案2】:

选项:

  • 创建集合类的实例,如数组或列表。默认情况下这将是可变的,如果这是您希望能够在 API 中分发的序列,这将有点无用。不过,您可以围绕这样的集合创建一个ReadOnlyCollection&lt;T&gt; 包装器
  • 按照 Botz3000 的回答编写您自己的迭代器块
  • 如果您使用的是 .NET 3.5,请使用 LINQ 中的 Enumerable.Repeat(item, 1)

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

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

我有信心Concat 不会改变数组,其他任何东西都不会看到对数组本身的引用。

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

【讨论】:

  • 对于那些使用 Rx (msdn.microsoft.com/en-us/devlabs/ee794896) 的人来说,另一个选择是 EnumerableEx.Return 方法。
  • 缺少最干净的方式:new [] { item }
  • @data_smith:“创建集合类的实例,如数组或列表”如何不涵盖这一点?
  • @JonSkeet:因为它是一个包罗万象的短语(您在列表中的第一项)。下面建议的 new[] { item } 应该是正确的,恕我直言。我个人不知道 VS 可以推断出数组类型。但是 nvm,这只是一个意见,我只是认为 new[]{} 更直接。
  • 如果您调用的方法将IEnumerable&lt;T&gt; 作为参数,那么假设它不会改变序列是否安全?至少不要在任何意义上对其进行变异,这会使发送数组变得不安全?
【解决方案3】:

你可以这样做:

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

【讨论】:

  • 我支持这个回复;这种技术对于枚举特定的成员变量也很有用。
【解决方案4】:

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

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

不管你怎么看,你实际上是在尝试制作一个包含一个元素的列表,然后真的没有理由让它成为一个列表。

【讨论】:

  • 将单个对象转换为 IEnumerable 可能有很多原因。例如。有人可能想将它传递给期望 IEnumerable 的方法,或者它可以用于模拟 Maybe monad 等。
  • 这在技术上是正确的,所以避免了我的反对。但考虑到这里的其他答案,它看起来几乎......悲观。
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多