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# - 在插入执行期间显示错误消息

c# - 在网络聊天中测试无法使用应用程序服务

c# - 通过 employeeID 获取 UserPrincipal

c# - 将控件数组添加到 aspx 页面

c# - Average 和 Sum 不适用于匿名类型?

c# - 如何在 C# 中创建类型化的 IEnumerable?

C#:将文件拖放到 .exe(图标)上并获取文件路径

c# - foreach 获取下一个项目

c# - 为什么 Cast<double>() 不能对 IEnumerable<int> 起作用?

c# - Database.Query 返回类型应该是 IEnumerable<dynamic>