Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# ELI5:将IEnumerable转换为列表或数组如何避免多次枚举IEnumerable的性能损失?_C#_Resharper_Ienumerable_Enumeration - Fatal编程技术网

C# ELI5:将IEnumerable转换为列表或数组如何避免多次枚举IEnumerable的性能损失?

C# ELI5:将IEnumerable转换为列表或数组如何避免多次枚举IEnumerable的性能损失?,c#,resharper,ienumerable,enumeration,C#,Resharper,Ienumerable,Enumeration,Resharper经常抱怨这一点:IEnumerable可能有多个枚举。例如: private int ParseLoanNumber(IEnumerable<string> lines) { var loanNumber = 0; var item = lines.FirstOrDefault(l => l.StartsWith(" LN# 00")); if (item != null)

Resharper经常抱怨这一点:IEnumerable可能有多个枚举。例如:

    private int ParseLoanNumber(IEnumerable<string> lines)
    {
        var loanNumber = 0;

        var item = lines.FirstOrDefault(l => l.StartsWith(" LN#    00"));

        if (item != null)
        {
            loanNumber = item.ParseInt(8, 10).GetValueOrDefault();
        }
        else
        {
            item = lines.FirstOrDefault(l => l.StartsWith(" LOAN-NO (CONT'D)  00"));
            if (item != null)
            {
                loanNumber = item.ParseInt(19, 10).GetValueOrDefault();
            }
        }
        // Yada yada...
    }
建议的解决方案是将可枚举项转换为列表或数组,并对其进行迭代


这使我困惑。您仍将枚举某些内容,并且类型数组和列表都实现IEnumerable。那么,这是如何解决任何问题的,或者以任何方式提高性能的呢?

因为您可以这样写:

public IEnumerable<int> GetNumbersSlowly()
{
    for (var i = 0; i < 100; i++)
    {
        Thread.Sleep(10000); //Or retrieve from a website, etc
        yield return i;
    }
}
这意味着每个数字在睡眠中所做的工作是两次的。对可枚举项求值一次并将其存储在数组或列表中,这意味着您可以确保不会执行任何额外的处理来返回这些项

因为您正在使用IEnumerable,所以您真的不知道调用方没有执行上述操作

如果您认为我的示例可能很少见或是边缘案例,那么它也适用于以下情况:

var numbers = GetNumbersSlowly();
foreach(var number in numbers) { 
    //Do something 
}
foreach(var number in numbers) { 
    //Do something 
}
var someSource = new List<int> { 1, 2, 3, 4, 5 };
var numbers = someSource.Select(s => s * 100000);

现在,每次迭代数字时,您也在进行计算。在这种情况下,工作并不多,为什么做得比你需要的多,而且这是一项非琐碎的工作也不少见。

仅举其他例子;有些IEnumerable是不可重复的-例如,它们可以从套接字或外部源(如包装IDataReader dapper的数据库查询)中提取数据,例如,允许这种类型的使用,或者如果我理解正确,它们可以从PRNG等CSO中提取数字,不转换的性能损失来自延迟执行。这大致正确吗?