了解 C# 语言中 FirstOrDefault 和 Find 之间的性能差异

作者:微信公众号:【架构师老卢】
1-30 19:48
658

概述:在 C# 中搜索满足集合条件的第一个元素时,开发人员经常面临是使用 还是 .这两种方法都旨在实现类似的目标,但它们的性能特征可能因上下文和数据类型而异。FirstOrDefaultFindFirstOrDefault:FirstOrDefault是一种常用的方法,尤其是在 LINQ 查询中。它旨在查找集合中满足指定条件的第一个元素并返回它。如果未找到此类元素,则返回默认值(null、0、false 等)。用法示例:var result = myList.FirstOrDefault(item = item.Property == targetValue);需要考虑的一点是,它经常用于 LINQ

在 C# 中搜索满足集合条件的第一个元素时,开发人员经常面临是使用 还是 .这两种方法都旨在实现类似的目标,但它们的性能特征可能因上下文和数据类型而异。FirstOrDefaultFind

FirstOrDefault:

FirstOrDefault是一种常用的方法,尤其是在 LINQ 查询中。它旨在查找集合中满足指定条件的第一个元素并返回它。如果未找到此类元素,则返回默认值(null、0、false 等)。

用法示例:

var result = myList.FirstOrDefault(item => item.Property == targetValue);

需要考虑的一点是,它经常用于 LINQ 查询,这些查询的复杂性可能会影响性能。FirstOrDefault

找到:

另一方面,是属于类的方法,直接对集合进行操作。与 类似,它查找集合中满足指定条件的第一个元素并返回该元素。如果未找到此类元素,则返回默认值。FindList<T>FirstOrDefault

用法示例:

var result = myList.Find(item => item.Property == targetValue);

与 LINQ 查询相比,该方法的执行速度往往更快,因为它直接遍历集合。Find

在性能方面,通常被认为更快,因为它更直接地迭代集合。但是,性能差异通常很小。首选方法可能取决于代码可读性、可维护性以及是否已在项目中使用 LINQ 等因素。Find

总之,两者都是查找满足 C# 条件的第一个元素的宝贵工具。虽然在某些情况下可能略有性能优势,但应根据项目的特定要求和设计原则在它们之间进行选择。FirstOrDefaultFindFind

性能基准测试:FirstOrDefault 与 C 语言中的查找#

在 C# 编程领域,开发人员经常会遇到需要从满足特定条件的集合中检索第一个元素的情况。用于此目的的两种常用方法是 和 。在本文中,我们将深入研究这些方法,并进行性能基准测试以比较它们的效率。FirstOrDefaultFind

我们可以在 C# 中创建一个基准来衡量 和 方法的性能。类似于以下的示例可以达到此目的FirstOrDefaultFind

基准测试性能

让我们使用库来衡量和比较这两种方法的性能,该库是用于对 C# 代码进行基准测试的强大工具。BenchmarkDotNet

基准测试设置

我们将创建一个基准测试,该测试填充不同大小的列表,并测量每种方法查找元素所花费的时间。

public class BenchmarkExampleFirst  
{  
    private List<int> myList;  
  
    [Params(10, 100, 1000)]   
    public int ListSize { get; set; }  
  
    [GlobalSetup]  
    public void Setup()  
    {  
        myList = Enumerable.Range(1, ListSize).ToList();  
    }  
  
    [Benchmark]  
    public int FirstOrDefaultBenchmark()  
    {  
        return myList.FirstOrDefault();   
    }  
}public class BenchmarkExampleFind  
{  
    private List<int> myList;  
  
    [Params(10, 100, 1000)]  
    public int ListSize { get; set; }  
  
    [GlobalSetup]  
    public void Setup()  
    {  
        myList = Enumerable.Range(1, ListSize).ToList();  
    }  
  
    [Benchmark]  
    public int FindBenchmark()  
    {  
        return myList.Find(x => x == 1);   
    }  
}

.Net Core 7.0 控制台应用程序

using BenchmarkDotNet.Running;  
using ConsoleApp4;  
  
Console.WriteLine("Hello, World!");  
  
  
Task firstTask = Task.Run(() => BenchmarkRunner.Run<BenchmarkExample>());  
Task findTask = Task.Run(() => BenchmarkRunner.Run<BenchmarkExampleFind>());  
  
await Task.WhenAll(firstTask, findTask);   
  
Console.WriteLine("end");

基准测试执行

设置基准测试后,我们将针对不同的列表大小运行测试,并测量两者和方法的执行时间。FirstOrDefaultFind

查找()

查找()

FirstOrDefault() (英语)

FirstOrDefault() (英语)

结果

在进行基准测试时,我们观察到 和 的性能可能会因集合的大小而异。在较小的列表中,差异可以忽略不计,但在较大的集合中,由于其直接基于列表的实现,其性能往往略好。FirstOrDefaultFindFind

结论

总之,和 方法在检索符合特定条件的第一个元素方面具有相似的目的。虽然它们的功能具有可比性,但性能的细微差别可能会影响它们之间的选择。开发人员在选择这些方法时应考虑集合大小和用例场景等因素,以确保其应用程序的最佳性能。FirstOrDefaultFind

从本质上讲,了解这些方法的性能特征使开发人员能够做出明智的决策,优化代码效率并提高应用程序性能。

阅读排行