LINQ 与传统基于集合的方法之间的优缺点
Posted
技术标签:
【中文标题】LINQ 与传统基于集合的方法之间的优缺点【英文标题】:Pros & cons between LINQ and traditional collection based approaches 【发布时间】:2010-09-08 02:03:31 【问题描述】:对于 .net 游戏来说相对较新,我想知道,有没有人对使用 LINQ 与使用列表/集合的更传统方法之间的利弊有任何经验?
对于我正在处理的项目的具体示例:正在从远程 Web 服务检索唯一 ID/名称对的列表。
此列表不会经常更改(每天一次), 从使用它的应用程序的角度来看是只读的 将存储在应用程序级别以供所有请求访问鉴于这些要点,我计划将应用程序级别的返回值存储在单例类中。
我最初的方法是遍历从远程服务返回的列表,并将其存储在单例类的 NameValueCollection 中,并使用基于 id 从集合中检索的方法:
sugarsoap soapService = new sugarsoap();
branch_summary[] branchList = soapService.getBranches();
foreach (branch_summary aBranch in branchList)
branchNameList.Add(aBranch.id, aBranch.name);
使用 LINQ 的替代方法是简单地添加一个在检索到列表后直接在列表上工作的方法:
public string branchName (string branchId)
//branchList populated in the constructor
branch_summary bs = from b in branchList where b.id == branchId select b;
return branch_summary.name;
其中一个比另一个更好 - 还有第三种方法吗?我对所有答案持开放态度,无论是在提供优雅的解决方案方面,还是在提高性能方面的解决方案方面。
【问题讨论】:
【参考方案1】:我不认为你写的 linq 会编译,它必须是
public string branchName (string branchId)
//branchList populated in the constructor
branch_summary bs = (from b in branchList where b.id == branchId select b).FirstOrDefault();
return branch_summary == null ? null : branch_summary.name;
注意 .FirstsOrDefault()
我宁愿使用 LINQ,因为它可以在其他地方使用,用于为您的数据编写更复杂的过滤器。我也认为它比 NameValueCollection 更容易阅读。
这是我的 0.02 美元
【讨论】:
【参考方案2】:一般来说,简单的单行 for/foreach 循环会比使用 Linq 更快。此外,在这种情况下,Linq 并不 [总是] 提供显着的可读性改进。这是我编写的一般规则:
如果算法足够简单,可以在没有 Linq 的情况下编写和维护,并且您不需要延迟评估,并且Linq 没有提供足够的可维护性改进,那么不要使用它。但是,有时 Linq 极大地 提高了代码的可读性和正确性,如我发布的两个示例所示 here 和 here。
【讨论】:
【参考方案3】:我不确定单例类是否绝对必要,您是否始终需要全局访问?列表很大吗?
我假设当属性需要更改时,您将在单例类上有一个刷新方法,并且您有一些方法可以在列表更改时通知单例进行更新。
这两种解决方案都是可行的。我认为 LINQ 会在构造函数中更快地填充集合(但不会明显更快)。传统的基于收集的方法很好。就个人而言,如果只是因为它是新技术并且我喜欢使用它,我会选择 LINQ 版本。假设您的部署环境具有 .NET 3.5...
您的网络服务是否有通过 ID 获取分支的方法?如果不经常需要分支信息,那将是第三种选择。
【讨论】:
【参考方案4】:缩短和工作:
public string BranchName(string branchId)
var bs = branchList.FirstOrDefault(b => b.Id == branchId);
return bs == null ? null : bs.Name;
【讨论】:
以上是关于LINQ 与传统基于集合的方法之间的优缺点的主要内容,如果未能解决你的问题,请参考以下文章
Java中数组集合链表队列的数据结构和优缺点和他们之间的区别