Linq中的这两个语句之间有区别吗?

Jaq*_*ues 0 c# linq

这两个语句之间是否有区别。我做了一个测试,但在延迟执行的测试中,它失败了。有什么区别?

items.Where(w => w.Length >= length).Select(w => w.Substring(0, length)).Distinct();
Run Code Online (Sandbox Code Playgroud)

(from a in items
                where a.Length >= 3
                select a.Substring(0, length)).Distinct();
Run Code Online (Sandbox Code Playgroud)

他们对我读得一样,我相信也完全一样吗?

Mar*_*ell 6

我假设3vs length是一个错字。

过去之后,这里的窍门是:试试吧;这里一个很好的工具是sharplab.io - 这里有两个例子,我们可以看到-编译和反编译之后-这MN大致相同:

public void M()
{
    IEnumerable<string> enumerable = Enumerable.Distinct(Enumerable.Select(Enumerable.Where(items, new Func<string, bool>(<M>b__2_0)), new Func<string, string>(<M>b__2_1)));
}

public void N()
{
    IEnumerable<string> enumerable = Enumerable.Distinct(Enumerable.Select(Enumerable.Where(items, new Func<string, bool>(<N>b__3_0)), new Func<string, string>(<N>b__3_1)));
}
Run Code Online (Sandbox Code Playgroud)

它们使用不同的编译器生成的方法,但实现方式相同:

[CompilerGenerated]
private bool <M>b__2_0(string w)
{
    return w.Length >= length;
}

[CompilerGenerated]
private string <M>b__2_1(string w)
{
    return w.Substring(0, length);
}

[CompilerGenerated]
private bool <N>b__3_0(string a)
{
    return a.Length >= length;
}

[CompilerGenerated]
private string <N>b__3_1(string a)
{
    return a.Substring(0, length);
}
Run Code Online (Sandbox Code Playgroud)

所以:我们可以得出结论,它们是相同的。