Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不创建新列表的情况下检索IEnumerable的基础列表?_C#_Ienumerable - Fatal编程技术网

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)。是的,这就是我的意思——但这并不是问题的答案。