当前位置: 首页 > article >正文

c# 在10万条数据中判断是否存在很慢问题

在C#中,使用List<T>.Where查询10万条数据是否存在会很慢,因为这会导致线性搜索,时间复杂度为O(n)。如果数据集很大,你应该使用更高效的数据结构,如HashSet<T>,它提供了O(1)的插入和查找操作。

using System;
using System.Collections.Generic;
using System.Diagnostics;
 
class Program
{
    static void Main()
    {
        var dataSet = new HashSet<int>();
        var largeList = new List<int>();
 
        // 填充数据集
        for (int i = 0; i < 10000000; i++)
        {
            dataSet.Add(i);
            largeList.Add(i);
        }
 
        var stopwatch = Stopwatch.StartNew(); // 开始计时
 
        // 测试数据是否存在
        bool exists = dataSet.Contains(5000000); // 假设我们查找的数据
 
        stopwatch.Stop(); // 停止计时
 
        Console.WriteLine($"Exists: {exists}, Time Elapsed: {stopwatch.ElapsedMilliseconds} ms");
 
        // 使用List.Where进行同样的查找
        stopwatch.Restart(); // 重新开始计时
 
        bool existsInList = largeList.Where(x => x == 5000000).Any();
 
        stopwatch.Stop(); // 停止计时
 
        Console.WriteLine($"Exists in List: {existsInList}, Time Elapsed: {stopwatch.ElapsedMilliseconds} ms");
    }
}

在C#中,使用List<T>.Where进行查询时,如果列表非常大(例如10万条数据),查询性能可能会变慢。这是因为Where方法会遍历整个列表来寻找匹配的元素。

为了提高性能,可以考虑以下方法:

  1. 使用HashSet<T>来存储需要查询的数据,这样可以将查询时间从O(n)降低到O(1)。

  2. 如果列表是有序的,可以使用二分查找,这样可以将查询时间从O(n)降低到O(log n)。

  3. 如果查询操作是频繁的,可以考虑使用更适合大数据量查询的数据结构,如Dictionary<TKey, TValue>或者专门的数据库索引等。

下面是一个使用HashSet<T>的示例代码:

// 假设我们有一个Person类和一个List<Person>
public class Person
{
    public int Id { get; set; }
    // 其他属性...
}
 
// 创建并填充列表
List<Person> people = new List<Person>();
// 填充数据... (假设已经填充了10万条数据)
 
// 创建HashSet存储Id
HashSet<int> personIds = new HashSet<int>(people.Select(p => p.Id));
 
// 查询数据是否存在
int searchId = 12345;
bool exists = personIds.Contains(searchId);

在这个示例中,我们首先创建了一个HashSet<int>,它存储了people列表中所有Person对象的Id。然后,我们可以使用Contains方法来快速检查某个Id是否存在于集合中,时间复杂度为O(1)。这种方法在需要频繁检查数据是否存在时效率会很高。


http://www.kler.cn/a/395204.html

相关文章:

  • SkyWalking-安装
  • 两种鼠标hover切换对应图片方法对比
  • 整理iPhone空间:iphone怎么删除相簿
  • Unity安装后点击登录没反应
  • 408笔记合集
  • ARM架构中断与异常向量表机制解析
  • 【金猿案例展】科技日报——大数据科技资讯服务平台
  • DB-GPT系列(五):DB-GPT六大基础应用场景part2
  • pyinstaller+upx给python GUI程序添加自定义图标
  • 驾校增加无人机培训项目可行性技术分析
  • 本地搭建你的私有网盘:在Ubuntu上使用Portainer CE安装NextCloud
  • 基于springboot+vue实现的高校电子图书馆的大数据平台 (源码+L文+ppt)4-013
  • Jmeter中的配置原件(四)
  • 机器学习周报(transformer学习1)
  • PG数据库 数据库时间字段 开始时间和结束时间,判断和查询条件的开始和截止时间存在交集,SQL如何编写
  • vue请求数据报错,设置支持跨域请求,以及2种请求方法axios或者async与await
  • golang反射函数注册
  • (十六)JavaWeb后端开发——Spring框架常见注解
  • 【C++】C++基础知识
  • 翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践
  • 使用 Python 向 IP 地址发送字符串 —— TCP 与 UDP 协议详解
  • 蓝桥杯——数组
  • kafka 的一些问题,夺命15连问后续
  • 1111111111待修改--大流量分析(三)-BUUCTF
  • MySQL推荐使用Docker部署吗?
  • FFmpeg的基本结构