c# - LINQ 性能常见问题

标签 c# .net linq performance

我正在尝试掌握 LINQ。最让我烦恼的是,即使我更好地理解语法,我也不想无意中为了表现力而牺牲性能。

它们是“Effective LINQ”的任何好的集中式信息或书籍存储库吗?否则,您个人最喜欢的高性能 LINQ 技术是什么?

我主要关注 LINQ to Objects,但当然也欢迎所有关于 LINQ to SQL 和 LINQ to XML 的建议。谢谢。

最佳答案

简单地了解 LINQ 在内部做什么应该会产生足够的信息来了解您是否正在遭受性能损失。

这是一个简单的示例,其中 LINQ 有助于提高性能。考虑这种典型的老派方法:

List<Foo> foos = GetSomeFoos();
List<Foo> filteredFoos = new List<Foo>();
foreach(Foo foo in foos)
{
    if(foo.SomeProperty == "somevalue")
    {
        filteredFoos.Add(foo);
    }
}
myRepeater.DataSource = filteredFoos;
myRepeater.DataBind();

所以上面的代码将迭代两次并分配第二个容器来保存过滤后的值。多么浪费!与之比较:
var foos = GetSomeFoos();
var filteredFoos = foos.Where(foo => foo.SomeProperty == "somevalue");
myRepeater.DataSource = filteredFoos;
myRepeater.DataBind();

这只迭代一次(当转发器被绑定(bind)时);它只使用原始容器; filteredFoos只是一个中间枚举器。如果出于某种原因,您决定稍后不绑定(bind)中继器,则不会浪费任何内容。你甚至不迭代或评估一次。

当您进行非常复杂的序列操作时,您可能会通过利用 LINQ 固有的链式和惰性求值的使用而获益良多。同样,与任何事情一样,这只是了解它实际在做什么的问题。

关于c# - LINQ 性能常见问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4044400/

相关文章:

c# - 使用 Linq 从 DataGridView 选择多行

c# - 如何有效地引用 C# 中的字符串?

c# - 名称 "Settings"在命名空间 "clr-namespace:MyApp.Properties"中不存在

c# - 优化C#中的字符串比较

.net - Powershell - 在应用程序配置文件中找不到程序集绑定(bind)重定向

c# - 使用 Lambda 或 LINQ 将一个类列表转换或映射到另一个类列表?

c# - 如何在 C# 中创建事件对象模式 TypedActor

c# - 我可以将 Unity 场景公开为 Web 服务吗?

.net - WPF Datagrid 模板删除了调整列大小的能力

c# - 检查 Entity Framework linq 结果中的项目