相对较新的.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;
}
要么比另一个更好 - 还有第三种方式吗?对于这两种方法,无论是提供优雅的解决方案还是有利于绩效的解决方案,我都会接受所有答案。
答案 0 :(得分:3)
我不认为你写的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美元
答案 1 :(得分:1)
通常,简单的一行for / foreach循环比使用Linq快。此外,在这种情况下,Linq [始终]不会提供显着的可读性改进。以下是我编码的一般规则:
如果算法非常简单,无需Linq即可编写和维护,并且您不需要延迟评估,和 Linq不能提供足够的可维护性改进,那么请不要使用它。但是,有时Linq 非常提高了代码的可读性和正确性,如我发布的here和here两个示例所示。
答案 2 :(得分:0)
我不确定单身类是绝对必要的,你是否绝对需要全局访问?名单大吗?
我假设你会在单例类上有一个刷新方法,用于何时需要更改属性,还有一些方法可以在列表更改时通知单例更新。
这两种解决方案都是可行的。我认为LINQ将在构造函数中更快地填充集合(但不会明显更快)。传统的基于集合的方法很好。就个人而言,我会选择LINQ版本,因为它是新技术,我喜欢使用它。假设您的部署环境具有.NET 3.5 ...
您的网络服务上是否有通过ID获取分支的方法?如果不经常需要分支信息,这将是第三个选项。
答案 3 :(得分:0)
缩短并加工:
public string BranchName(string branchId)
{
var bs = branchList.FirstOrDefault(b => b.Id == branchId);
return bs == null ? null : bs.Name;
}