在以下情况下,linq技术的效率会降低多少,并且可以进行优化?

时间:2011-04-24 14:08:15

标签: .net linq performance optimization

在以下情况下,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;
}

2 个答案:

答案 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>或数组,第二个可以更快。

但这些优化最有可能不会产生任何可衡量的影响。