【问题标题】:What is the simplest way to get generic IEnumerable<T> from System.Collections.IEnumerable? [duplicate]从 System.Collections.IEnumerable 获取通用 IEnumerable<T> 的最简单方法是什么? [复制]
【发布时间】:2017-03-20 04:51:35
【问题描述】:

System.Collections.IEnumerable(仅包含T 类型元素)获取通用IEnumerable&lt;T&gt; 的最简单方法是什么?

有人对我说应该有简单的(避免使用 LINQ)标准包装器,但我找不到。

【问题讨论】:

  • 我没看懂你的问题,你能说清楚点吗?
  • 使用 OfType 或 Cast 扩展。
  • 您很可能正在寻找Cast 方法,但它被认为是LINQ(在Enumerable 类中定义)。如果您确定它只包含 T 类型元素,您可以使用简单的 C# 转换,例如(IEnumerable&lt;T&gt;)enumerable
  • @IvanStoev 简单转换仅在底层类型 also 实现 IEnumerable&lt;T&gt; 时才有效。例如static IEnumerable Test() { yield return 1;yield return 2;} 只包含int 类型的元素,但不能转换为IEnumerable&lt;int&gt;
  • @MarcoSalerno 而不是“避免 Linq”我想说避免“Linq.Expression”。在我的想象中,每个 System.Linq 功能都在内部进行了表达式解析:) 对于这样的任务来说,这太过分了,但现在我发现它是错误的。 Cast 不包含表达式,是我需要的。

标签: c# collections


【解决方案1】:

使用 LINQ 是最简单和最短的。您可以在没有 LINQ 的情况下枚举它:

foreach (T item in IEnumerableCollection)

这几乎就是.Cast&lt;T&gt;() 所做的:

static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) {
    foreach (object obj in source) yield return (TResult)obj;
}

【讨论】:

  • 谢谢。你是对的 Cast 即使它来自 System.Linq 命名空间不包含我真正想要避免的表达式。
猜你喜欢
  • 2010-12-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多