c# - 如何在不创建新列表的情况下检索 IEnumerable 的基础列表?

标签 c# ienumerable

当使用 IEnumerable 时,我试图避免多重枚举。我知道我可以只使用 LINQ 的 .ToList() 并完成它,但这可能是很多不必要的列表创建。我想:

  1. 检查并查看底层类型是否为 List,如果是则返回该实例,否则返回
  2. .ToList() 它并返回新的列表

我的想法是使用类似于:

public void Fee()
{
    var list = new List<string>(); // I want to retrieve this instance in Foo
    Foo(list);
}

public void Foo(IEnumerable<T> enumerable)
{  
    var list = enumerable as List<T> ?? enumerable.ToList();
    // do stuff with original list 
}

...但是从文档中可以看出,as 运算符只是执行一个强制转换,这将创建一个新列表而不是返回基础列表,不是吗?

如果是这样,我如何才能检索基础列表而不是创建一个新列表?

最佳答案

as operator不会创建新列表。它只检查类型并在类型兼容时执行转换。

帖子中的代码在逻辑上是正确的,并且与实现的 LINQ 方法的数量相匹配(例如,请参阅 Enumerable.Count 的源代码,它转换为 ICollection 以查看它是否可以跳过项目枚举)。

请注意,转换为正确的列表通用版本或其接口(interface)之一很重要 - IList如果您必须使用非通用版本,则可以使用。请注意 List<T>不是协/反变体,类型必须完全匹配,与 covariant 的情况不同IEnumerable<out T>您可以在其中将参数转换为 IEnumerable<TBase>如果IEnumerable<TDerived>通过。

关于c# - 如何在不创建新列表的情况下检索 IEnumerable 的基础列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55730958/

相关文章:

c# - 动画wpf列表框的选定项目

c# - 枚举器行为的变化基于我们如何引用它?

.net - 你怎么称呼 IEnumerable<Foo>?

c# - 从其他类使用 GetEnumerator 时如何处理 foreach null 异常?

c# - Entity Framework 错误,一张表总是超时

c# - Excel VSTO 和 Ninject.Extensions.Factory 中的依赖注入(inject)

c# - 将压缩文件保存到同一目录

c# - C# 应用程序之间的双向 IPC

c# - IEnumerable/Enumerable with Double/Int;初学者

c# - 是否可以使 IEnumerable<char> 实现 IComparable?