两者之间没有区别。
代码 -
static void Main(string[] args)
{
string[] letters = { "d", "c", "a", "b" };
var sorted = from letter in letters
orderby letter
select letter;
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)
{
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)
{
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
。但是,如果在第二个变体中,我们添加了一个显式的Select
,那么就有点不足为奇了,但是编译器并不会优化掉显式的.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)
{
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)
{
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);