当使用 IEnumerable
时,我试图避免多重枚举。我知道我可以只使用 LINQ 的 .ToList()
并完成它,但这可能是很多不必要的列表创建。我想:
- 检查并查看底层类型是否为 List,如果是则返回该实例,否则返回
.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/