如何创建一个单例的IEnumerable?

19

C#是否提供了将类型为T的单个实体转换为IEnumerable<T>的好方法?

我能想到的唯一方法是:

T entity = new T();
IEnumerable<T> = new List { entity }.AsEnumerable();

我猜应该有更好的方法。


3
可能出现重复:https://dev59.com/Am445IYBdhLWcg3wmLhe将单个实例对象作为IEnumerable返回。 - Justin
可能是将单个项作为IEnumerable <T>传递的重复问题。 - nawfal
3个回答

25
您的 AsEnumerable() 调用是不必要的。通常情况下,AsEnumerable 用于目标对象实现了 IQueryable<T>,但您想强制它使用 LINQ-to-Objects(例如在对使用LINQ兼容的ORM进行客户端筛选时)。由于 List<T> 实现了 IEnumerable<T> 而不是 IQueryable<T>,所以没有必要使用它。

无论如何,您也可以使用单个元素的数组来创建您的项;

IEnumerable<T> enumerable = new[] { t };

或者使用Enumerable.Repeat函数
IEnumerable<T> enumerable = Enumerable.Repeat(t, 1);

注意:数组构造函数语法明显更高效(但这种微观优化通常不相关);另一方面,repeat方法保证是不可变的。 - Eamon Nerbonne
1
我喜欢 Enumerable.Repeat 允许你隐藏后备类型。此外,我认为它可能是用循环/ yield 实现的,因此可以成为延迟执行实现的基础。 - Sprague
@Sprague:如果你所说的“隐藏后备类型”是指能够在不显式指定泛型参数的情况下调用Repeat方法,那么隐式数组语法(new[] { t })也可以实现同样的效果。 - Adam Robinson
@AdamRobinson 不好意思,可能是我用词不当。我指的是IEnumerable的实现(数组v.列表v.值生成函数)。 - Sprague

6

我使用

Enumerable.Repeat(entity, 1);

6
var entity = new T();
var singleton = Enumerable.Repeat(entity, 1);

虽然在大多数情况下我会直接使用 var singleton = new[] { entity };,特别是如果只是用于私人使用。


2
奇怪的是,VB.NET 比 C# 更简洁!创建数组只需 { entity } - R. Martinho Fernandes
2
@Martinho:在C#中,你可以使用T[] x = { y }或者var x = new[] { y },但是不能使用var x = { y } - LukeH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接