在以下情况下,linq技术会有多少效率,并且可以进行优化?
Linq技术:
public String FindProviderName(Int32? TrueName)
{
String providerName = (from p in this.Providers
where p.TrueName == TrueName
select p.ProviderName).First().ToString();
return providerName;
}
步行技术:
public String FindProviderName(Int32? TrueName)
{
String providerName = String.Empty;
foreach (IProvider provider in this.Providers)
{
if (provider.TrueName == TrueName)
{
providerName = provider.ProviderName;
break;
}
}
return providerName;
}
答案 0 :(得分:2)
如果这是LINQ到对象,它们都会非常快。如果您想要更快,请考虑使用Dictionary<int,string>
并使用TryGetValue(...)
。显然你需要预先生成字典,也许是通过ToDictionary()。
请注意,当没有匹配时,显示的两个示例是不同的;一扔;一个返回一个空字符串。此外,无需在字符串上调用ToString()。
更快的版本(评论);你需要一个领域,
Dictionary<int,string> lookup;
在使用之前(或数据更改之后)的某个时刻,您需要填充它:
lookup = providers.Where(p => p.RealName != null)
.ToDictionary(p => p.RealName.Value,
p => p.ProviderName);
然后你的查找就像:
string providerName;
if(realName == null ||
!lookup.TryGetValue(realName.Value, out providerName))
return null;
return providerName;
答案 1 :(得分:1)
你有代码,如果你想知道它的效率,只需测量它。
当然,人们经常担心代码的效率,而不应该。可读性不是更重要吗?这是使你慢下来的代码吗?
话虽如此,第一段代码可以像这样稍快一点:
public String FindProviderName(Int32? TrueName)
{
String providerName = this.Providers
.First(p => p.TrueName == TrueName)
.Select p.ProviderName);
return providerName;
}
使用for
代替foreach
(如果您的集合类型为List<T>
或数组,第二个可以更快。
但这些优化最有可能不会产生任何可衡量的影响。