gpt4 book ai didi

C# linq order by 和其他带有 foreach 的语句,是否存在性能差异?

转载 作者:太空狗 更新时间:2023-10-29 23:07:10 26 4
gpt4 key购买 nike

我经常使用 Entity Framework 、集合进行编程,还使用 ​​where-conditions 和 order by actions。我一直在问自己这个问题,但一直没弄明白。

假设我有以下两段代码;

示例 1:

// An unsorted string array.
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);
}

示例 2:

// An unsorted string array.
string[] letters = { "d", "c", "a", "b" };

// Loop with the foreach keyword.
foreach (string val in letters.OrderBy(l => l))
{
console.writeline(val)
}

第一个示例首先对结果集进行排序,然后遍历集合,在我们要对其进行迭代时,第二个示例具有排序依据。现在真正的问题我一直想知道在哪里.. 性能有什么区别(如果有的话)?这两种方法中的一种比另一种更好吗?与 where 条件(带连接的简单条件和复杂条件)相同,有什么显着差异吗?

最佳答案

两者没有区别..

代码-

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 。但是,如果在第二个变体中,我们采用在显式 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)
{
// 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);

关于C# linq order by 和其他带有 foreach 的语句,是否存在性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26460540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com