C# 如何在不创建新列表的情况下检索IEnumerable的基础列表?
使用C# 如何在不创建新列表的情况下检索IEnumerable的基础列表?,c#,ienumerable,C#,Ienumerable,使用IEnumerable时,我试图避免多次枚举。我知道我可以使用LINQ的.ToList()并完成它,但这可能是很多不必要的列表创建。我想: 检查并查看基础类型是否为列表,如果是,则返回该实例,否则返回 .ToList()打开并返回新列表 我的想法是使用类似于: public void Fee() { var list = new List<string>(); // I want to retrieve this instance in Foo Foo(list)
IEnumerable
时,我试图避免多次枚举。我知道我可以使用LINQ的.ToList()
并完成它,但这可能是很多不必要的列表创建。我想:
.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
}
公共作废费()
{
var list=new list();//我想在Foo中检索这个实例
Foo(名单);
}
公共void Foo(IEnumerable可枚举)
{
var list=可枚举为列表??可枚举.ToList();
//用原始列表做一些事情
}
。。。但是从文档中可以看出,as
操作符只是执行一个cast,它将创建一个新列表,而不是返回底层列表,不是吗
如果是这样,我如何检索基础列表而不是创建一个新列表 不会创建新列表。它仅检查类型,并在类型兼容时执行强制转换
post中的代码在逻辑上是正确的,并且与实现的LINQ方法的数量相匹配(例如,请参阅将哪些方法的源代码强制转换为ICollection
,以查看它是否可以跳过项的枚举)
请注意,强制转换以更正列表的通用版本非常重要,或者如果必须使用非通用版本,则可能它的一个接口--
IList
将起作用。请注意,List
不是co/contra变量,类型必须完全匹配,这与IEnumerable
的情况不同,在这种情况下,如果IEnumerable
通过,您可以将参数强制转换为IEnumerable
。也许您想这样做:
public void Fee()
{
var list = new List<string>(); // I want to retrieve this instance in Foo
Foo(list);
}
public void Foo<T>(IEnumerable<T> enumerable)
{
List<T> list = enumerable as List<T> ?? enumerable.ToList();
// do stuff with original list
}
公共作废费()
{
var list=new list();//我想在Foo中检索这个实例
Foo(名单);
}
公共void Foo(IEnumerable可枚举)
{
列表=可枚举为列表??可枚举.ToList();
//用原始列表做一些事情
}
“但是从文档中可以看出,as操作符只是执行了一个强制转换,这将创建一个新列表,而不是返回基础列表,不是吗?”--不,不会。为什么不调整foo以采用正确的类型呢?您的假设是whrong。as
-cast不会创建新列表,如果可能,它只会强制转换现有列表,如果不可能,则返回null。所以你的问题根本无法回答,因为它是基于一个错误的假设。强制转换不会创建新对象,因此不涉及复制。@RobertHarvey好吧,它只是一个可以应用于集合类型和非集合类型的操作,所以我不确定使用大O表示法是否有意义。这就像问实例化一个新对象是否为O(n)。是的,这就是我的意思——但这并不是问题的答案。