c# - 与数组相比,使用 IEnumerable 有哪些优势?

标签 c# performance linq

Code Review.stackexchange 上问了我的问题之后我被建议使用以下代码片段。我注意到在传输过程中,string[] Lines 被设置为 IEnumerable。

仔细查看 IEnumerable 函数后,我没有发现任何可以提高性能的信息。那么这只是为了可读性吗?或者使用 IEnumerable 而不是数组实际上是否存在性能差异或一般优势?

private void ProcessSingleItem(String fileName, String oldId, String newId)
{
    string[] lines = File.ReadAllLines(fileName);

    File.WriteAllText(fileName, ProcessLines(lines, oldId, newId));
}  

private String ProcessLines(IEnumerable<String> lines, String oldId, String newId)
{
    StringBuilder sb = new StringBuilder(2048);
    foreach (String line in lines)
    {
        sb.AppendLine(line.Replace(oldId, newId));
    }
    return sb.ToString();
}  

最佳答案

到目前为止,所有的答案都表明,接受的内容更通用会使您的辅助方法更有用。这是对的。但是,还有其他注意事项。

  • 优点:使用序列而不是数组可以告诉调用您的代码的开发人员“我不会改变您传给我的对象”。当我调用采用数组的方法时,我怎么知道它不会更改数组?

  • 缺点:采用更通用的类型意味着您的方法对于该更通用类型的任何实例都必须是正确的。你怎么知道它是正确的?测试。因此,采用更通用的类型可能意味着更大的测试负担。如果你采用一个数组,那么你只有几种情况:空数组、空数组、协变数组等等。如果您采用序列,则要测试的案例数量会更多。

  • 您提到了性能。请记住,根据感觉而不是经验数据做出微观决定是获得良好绩效的糟糕方法。相反,设定一个性能目标,根据该目标衡量您的进度,并使用分析器找到最慢的东西;先攻击那个数组上的 foreach 循环编译为等效的 for 循环;在 IEnumerable 上,代码更复杂并且可能慢几微秒。您的应用程序在市场上的成功或失败是否将由这些微秒决定?如果是这样,那么仔细衡量性能。如果不是,请按照您喜欢的方式编写代码,如果您引入了导致您不再满足目标的回归,您的自动化测试会告诉您。您正在运行自动化性能测试,对吗?如果您如此关心性能,那您应该如此。

关于c# - 与数组相比,使用 IEnumerable 有哪些优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26178335/

相关文章:

javascript - 将ajax中的复杂对象发送到MVC

performance - ADD 1 真的比 INC 快吗? x86

c# - LINQ:WHERE 子句中的 IF 条件不起作用

c# - Selenium C# - ElementExists 没有 "By locator"

c# - Unity 容器内存泄漏

c# - Console.WriteLine 加速我的代码?

c# - 如何使用 Expression 构建匿名类型?

sql - LINQ 中的 count VS select - 哪个更快?

c# - 高性能 mysql INSERT

performance - Tomcat 对比 Websphere 的 Web 容器性能