两者没有区别..
代码-
static void Main(string[] args)
{
string[] letters = { "d", "c", "a", "b" };
// Use LINQ query syntax to sort the array alphabetically.
var sorted = from letter in letters
orderby letter
select letter;
// Loop with the foreach keyword.
foreach (string value in sorted)
{
Console.WriteLine(value);
}
foreach (string val in letters.OrderBy(letter => letter))
{
Console.WriteLine(val);
}
}
生成的代码-
private static void Main(string[] args)
{
string[] strArray1 = new string[4]
{
"d",
"c",
"a",
"b"
};
string[] strArray2 = strArray1;
if (Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate2 == null)
{
// ISSUE: method pointer
Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate2 = new Func<string, string>((object) null, __methodptr(\u003CMain\u003Eb__0));
}
Func<string, string> keySelector1 = Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate2;
foreach (string str in (IEnumerable<string>) Enumerable.OrderBy<string, string>((IEnumerable<string>) strArray2, keySelector1))
Console.WriteLine(str);
string[] strArray3 = strArray1;
if (Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate3 == null)
{
// ISSUE: method pointer
Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate3 = new Func<string, string>((object) null, __methodptr(\u003CMain\u003Eb__1));
}
Func<string, string> keySelector2 = Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate3;
foreach (string str in (IEnumerable<string>) Enumerable.OrderBy<string, string>((IEnumerable<string>) strArray3, keySelector2))
Console.WriteLine(str);
}
[CompilerGenerated]
private static string \u003CMain\u003Eb__0(string letter)
{
return letter;
}
[CompilerGenerated]
private static string \u003CMain\u003Eb__1(string letter)
{
return letter;
}
编辑:
这是我很想尝试的一个有趣的变体。在上面的例子中,对于查询表达式,编译器足够聪明,可以优化 Select away.. 但是,如果在第二个变体中,我们添加一个显式的 @987654324 呢? @。这并不奇怪,但编译器仍然没有优化掉显式的.Select(与查询表达式中的显式Select相比——编译器的要求)。
代码-
foreach (string val in letters.OrderBy(letter => letter).Select(letter => letter))
{
Console.WriteLine(val);
}
生成的代码-
string[] strArray4 = strArray1;
if (Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate6 == null)
{
// ISSUE: method pointer
Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate6 = new Func<string, string>((object) null, __methodptr(\u003CMain\u003Eb__2));
}
Func<string, string> keySelector3 = Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate6;
IOrderedEnumerable<string> orderedEnumerable = Enumerable.OrderBy<string, string>((IEnumerable<string>) strArray4, keySelector3);
if (Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate7 == null)
{
// ISSUE: method pointer
Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate7 = new Func<string, string>((object) null, __methodptr(\u003CMain\u003Eb__3));
}
Func<string, string> selector = Program.CS\u0024\u003C\u003E9__CachedAnonymousMethodDelegate7;
foreach (string str in Enumerable.Select<string, string>((IEnumerable<string>) orderedEnumerable, selector))
Console.WriteLine(str);