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

.net 在以下情况下,linq技术的效率会降低多少,并且可以进行优化?,.net,linq,performance,optimization,.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).Fir

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

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;
}

如果这是LINQ到对象,它们都会非常快。如果您想要更快,请考虑<代码>字典<代码>,并使用<代码> TyGETValuy(…)<代码>。显然,您需要预先生成字典,可能是通过ToDictionary()生成的

注意,当没有匹配时,所示的两个示例是不同的;一人投掷;返回一个空字符串。此外,不需要对字符串调用ToString()


更新更快的版本(评论);你需要一个领域

Dictionary<int,string> lookup;
然后,您的查找将如下所示:

string providerName;
if(realName == null ||
    !lookup.TryGetValue(realName.Value, out providerName))
    return null;
return providerName;

你有代码,如果你想知道它有多高效,只需测量它

当然,人们经常担心代码的效率,而他们本不应该这样做。可读性不是更重要吗?这就是让你慢下来的代码吗

也就是说,firs代码可以像这样稍微快一点:

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

    return providerName;
}
如果集合类型是
列表
或数组,则使用
for
而不是
foreach
,可以加快第二个集合


不过,这两种优化很可能不会产生任何可测量的效果。

如果
ProviderName
string
,则不需要对其调用
ToString()
。没错,但编译器会知道这一点,并且不必费心在IL@Carnotaurus中运行它,但它只是“返回此项”的callvirt,非常快哦,我以为编译器会足够聪明,不会编译这样一个多余的语句。所以,我会给他一个投票。@Carnotaurus-编译器也希望程序员足够聪明,不会添加多余的语句:)事实上,它消除了一些,而不是所有的愚蠢。是的,这两种技术做的事情并不完全相同-你能给我一个更快实现这两种技术的例子吗?是的,我要求将linq重写为更基本的lamdba将略微提高速度。。。是的,这是IList