【问题标题】:How can I create a singleton IEnumerable?如何创建单例 IEnumerable?
【发布时间】:2011-02-10 16:51:06
【问题描述】:

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

我能想到的唯一方法是:

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

而且我想应该有更好的方法。

【问题讨论】:

标签: c# generics ienumerable


【解决方案1】:

您无需致电AsEnumerable()AsEnumerable 通常用于目标对象实现 IQueryable&lt;T&gt; 但您希望强制它使用 LINQ-to-Objects 的情况(例如,在与 LINQ 兼容的 ORM 上执行客户端过滤时)。由于List&lt;T&gt; 实现了IEnumerable&lt;T&gt; 而不是IQueryable&lt;T&gt;,所以不需要它。

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

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

Enumerable.Repeat

IEnumerable<T> enumerable = Enumerable.Repeat(t, 1);

【讨论】:

  • 注意:数组构造函数的语法效率明显更高(但这种微优化通常不相关);另一方面,重复方法保证是不可变的。
  • 我喜欢 Enumerable.Repeat 允许您隐藏支持类型。另外,我>假设
  • @Sprague:如果通过“隐藏支持类型”,您指的是在没有显式指定泛型参数的情况下调用Repeat 的能力,那么隐式数组语法 (new[] { t }) 可以同样的事情。
  • @AdamRobinson 不,对我而言,这可能是一个令人困惑的词语选择。我指的是 IEnumerable (array v. list v. value-yielding function)的实现
【解决方案2】:

我用

Enumerable.Repeat(entity, 1);

【讨论】:

    【解决方案3】:
    var entity = new T();
    var singleton = Enumerable.Repeat(entity, 1);
    

    (虽然在大多数情况下我可能只会使用var singleton = new[] { entity };,尤其是如果它仅用于私人用途。)

    【讨论】:

    • 奇怪的是 VB.NET 没有 C# 冗长!创建数组只是{ entity }
    • @Martinho:在 C# 中,您可以使用 T[] x = { y }var x = new[] { y },但不能使用 var x = { y }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2023-02-16
    • 1970-01-01
    相关资源
    最近更新 更多