gpt4 book ai didi

c# - 这个 LINQ 示例的复杂性是什么?

转载 作者:行者123 更新时间:2023-11-30 16:32:28 27 4
gpt4 key购买 nike

我想知道 LINQ 的一般性能。我承认,它很方便,但 LINQ 的性能如何?我知道这是一个广泛的问题。所以我想问一个具体的例子:

我有一个匿名类型:

var users = reader.Select(user => new MembershipUser(reader.Name, reader Age));

现在,我想将其转换为 MembershipUserCollection

所以我是这样做的:

MembershipUserCollection membershipUsers = new MembershipUserCollection();
users.ToList().ForEach(membershipUsers.Add); //what is the complexity of this line?

最后一行的复杂度是多少?是 n^2 吗?

ToList() 方法是否对用户的每个元素进行迭代并将其添加到列表中?还是 ToList() 的工作方式不同?因为如果不是,我很难判断使用代码的最后一行而不是简单地使用代码的原因:

foreach (var user in users)
{
membershipUsers.Add(user);
}

最佳答案

您的示例对于您的问题不是特别好,因为 ToList() 与其他支持 LINQ 的扩展方法并不真正属于同一类扩展方法。 ToList() 扩展方法是一个转换 操作,而不是查询操作。 LINQ 中的真正值(value)是延迟执行通过组合多个 LINQ 查询操作构建的复合查询和改进的可读性。在 LINQ2SQL 中,您还可以获得构造任意查询的优势,这些查询被推送到数据库服务器以供实际执行,利用数据库可能已进行的优化来提高性能。

一般来说,我认为性能问题在很大程度上取决于您构建实际查询的程度,并且与程序员对工具和数据的了解程度比工具的实现程度有更多关系。在您的情况下,如果您只关心性能,那么构建一个临时列表只是为了能够对其调用方便的 ForEach 方法是没有意义的。你最好简单地迭代你已经拥有的枚举(正如你所怀疑的那样)。 LINQ 不会阻止程序员编写错误代码,尽管它可能会为不了解 LINQ 工作原理的人掩盖错误代码。

对于任何使用 LINQ 的程序,您总是可以构造一个不使用 LINQ 的等效程序。可能您实际上可以提高性能。不过,我认为 LINQ 比非 LINQ 解决方案更容易编写可读代码。那样的话,我的意思是更紧凑和更容易理解。它还使编写可组合代码变得更加容易,当以延迟方式执行时,这些代码的性能优于非 LINQ 组合。通过将代码分解为可组合的部分,您可以简化它并提高可理解性。

我认为这里的诀窍是真正理解 LINQ 的意义所在,而不是将其视为一个 Shiny 的新工具,您现在需要使用它来解决您遇到的每个问题。不过,这个 Shiny 的新工具的好处在于它确实在很多情况下都能派上用场。

关于c# - 这个 LINQ 示例的复杂性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com