2011-04-24 52 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

相關問題