首页 > 编程语言 >c# 在10万条数据中判断是否存在很慢问题

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

时间:2024-04-07 17:12:36浏览次数:31  
标签:10 HashSet c# List 查询 万条 stopwatch Where Id

 

在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)。这种方法在需要频繁检查数据是否存在时效率会很高。

标签:10,HashSet,c#,List,查询,万条,stopwatch,Where,Id
From: https://www.cnblogs.com/qingjiawen/p/18119452

相关文章

  • node 建立一个electron的hello world 的工程 有窗体const { app, BrowserWindow } = r
     要创建一个Electron的"HelloWorld"工程,可以按照以下步骤进行:首先,确保你已经安装了Node.js。使用命令行工具进入你要创建项目的目录。运行以下命令来初始化一个新的Node.js项目:bash|npminit-y这将创建一个默认的package.json文件。确保你......
  • 贪心算法|1005.K次取反后最大化的数组和
    力扣题目链接classSolution{staticboolcmp(inta,intb){returnabs(a)>abs(b);}public:intlargestSumAfterKNegations(vector<int>&A,intK){sort(A.begin(),A.end(),cmp);//第一步for(inti=0;i<A.size......
  • OpenCV4.9处理平滑图像
    返回:OpenCV系列文章目录(持续更新中......)上一篇:使用OpenCV4.9的随机生成器和文本下一篇:OpenCV系列文章目录(持续更新中......)目标在本教程中,您将学习如何使用OpenCV函数将不同的线性滤波器应用于平滑图像,例如:blur()GaussianBlur()medianBlur()bilateralFilter()相关理......
  • CSS 下拉菜单
    *{margin:0;padding:0;}.menu{width:1050px;height:60px;border:1pxsaddlebrownsolid;margin:auto;background-color:#1B2534;}.menuli{height:50px;width:170px;/*border:1pxsalmonsolid;*/......
  • Oracle EBS 查询用户密码
    程序包头: CREATEORREPLACEPACKAGEcux_fnd_web_secISFUNCTIONget_user_pass(p_fnd_userINVARCHAR2,p_guest_loginINVARCHAR2DEFAULT'GUEST/ORACLE')RETURNVARCHAR2;FUNCTIONget_apps_pass(p_guest_loginINV......
  • TOPCODER时期训练赛小总结
    20240407模拟赛T1TurnOnLamps直接树上dp维护子树内是否有路径在根节点处停止的最小操作数\(O(n)\)维护即可,数据范围纯sbT2XorCards线性基或高斯消元板子,高斯消元比较好想。可以枚举大于等于时前若干位是相同的,然后直接搞出限制消元即可。时间复杂度合理。线性基则非常......
  • Solo 开发者周刊 (第10期):Sora 之后,谁是被遗忘的?谁又是被仰望的?
    这里会整合Solo社区每周推广内容、产品模块或活动投稿,每周五发布。在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解。本杂志开源,欢迎投稿。好文推荐Solo社区x机器之心-再谈复现Sora:被仰望与被遗忘的Sora给整个AI领域带来的最大......
  • CentOS 安装OpenJDK 11
    安装OpenJDK11sudoyuminstalljava-11-openjdk-devel   2.确认Java版本java-version   3.配置JAVA_HOME环境变量update-alternatives--configjava在输出的结果中,你会看到Java的安装路径,然后配置环境变量,如下:sudovi/etc/profile在文件的末尾,添加以......
  • 《A Review of Motion Planning Techniques for Automated Vehicles》阅读
    这是一篇2015年的老论文了,但其中提到的很多技术至今仍在使用,在这里做一个简单的梳理。文章主要对用于自动驾驶的运动规划技术进行了梳理。在讲解具体的算法之前,有必要对自动驾驶的规划控制整体有一个了解。规划控制的整体流程如图所示,我们用一个例子来解释上图。假设你现在准备......
  • teamcenter 如何处理vlas不一致的问题
    从西门子官网下载vla校验工具,校验后,生成fix的sql,执行后即可修复java-jarD:\soft\tc_vla_tool\tc_vla_diagnostics.jar-oracle=@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.151.246)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SE......