我正在努力和林克打交道.最让我困扰的是,即使我更好地理解了语法,我也不想在无意中为了表现力而牺牲性能.

他们是否有"高效LINQ"的信息或书籍的良好集中存储库?如果不行,你个人最喜欢的高性能LINQ技术是什么?

我主要关心LINQ到对象,但当然也欢迎所有关于LINQ到SQL和LINQ到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();

这只会迭代一次(当中继器被绑定时);它只使用原始容器;filteredFoos只是一个中间枚举数.如果出于某种原因,您决定以后不绑定中继器,那么就不会浪费任何东西.你甚至不需要迭代或计算一次.

当你进行非常复杂的序列操作时,你可以通过利用LINQ固有的链式和惰性判断来获得很多好处.同样,和其他事情一样,这只是理解它实际上在做什么的问题.

.net相关问答推荐

Visual Studio 2022 中的目标操作系统和目标运行时有什么区别?

为什么我在环境变量中有不同的值?

F#:跨度、提升和底部类型(或缺乏)

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

您如何确定两个 HashSet 是否相等(按值,而不是按引用)?

C# 的部分类是糟糕的设计吗?

在 C# DllImport 中使用 32 位或 64 位 dll

Silverlight 与 Flex

在 .NET C# 中存储加密密钥的最佳方式

将屏幕捕获为位图

将 Topshelf 应用程序安装为 Windows 服务

如何将自定义 UserControl 显示为对话框?

如何在可取消的异步/等待中处理 TransactionScope?

形成两个列表并集的最简单方法

将 StreamReader 返回到开头

Linq to SQL - 返回前 n 行

在 .NET 中获取默认打印机的最佳方法是什么

将控制台输出镜像到文件

检测到包降级警告(dotnet core,vs 2017)

如何在 ASP.NET MVC 中重定向到动态登录 URL