2011-04-24 47 views
1

linq技术在以下情况下效率低多少,可以优化吗?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; 
} 
+1

如果'ProviderName'是'string',你并不需要调用'的ToString()'就可以了。 – svick 2011-04-24 14:18:28

+0

这是正确的BU编译器会知道,而不用在IL中运行它? – CarneyCode 2011-04-24 14:20:34

+0

@Carnotaurus它会运行它,但它只是一个callvirt来“返回这个”,所以非常快 – 2011-04-24 14:24:04

回答

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; 
+0

是的,这两种技术并不完全相同 - 你能否给我一个更快实现的例子? – CarneyCode 2011-04-24 14:24:13

1

你有代码,如果你想知道它的效率如何,只需测量它。

当然,人们经常担心代码效率,当他们不应该。不可读性更重要吗?这是减慢你的代码吗?快使用for代替foreach(如果您的集合类型是List<T>或阵列

public String FindProviderName(Int32? TrueName) 
{ 
    String providerName = this.Providers 
           .First(p => p.TrueName == TrueName) 
           .Select p.ProviderName); 

    return providerName; 
} 

,第二个可以由:

话虽这么说,杉杉代码可以稍快了这样的。

这两项优化,最有可能将不会有任何可衡量的效果,虽然。

+0

是的,我不得不重写linq作为一个更基本的lamdba会略微提高速度......是的,这个。提供商是IList CarneyCode 2011-04-24 14:28:58

相关问题