【實戰】提升List性能方法有幾何

在內存中的 List<T> 上使用 LINQ 查詢時,加索引并不像數據庫那樣有內置支持,但可以通過以下方式提高查詢性能:


1. 手動構建索引

可以手動構建一個字典 (Dictionary<TKey, TValue>),將需要查詢的字段作為鍵,值為對應的數據。查詢時直接利用字典的 O(1) 查找性能。

示例代碼:
// 假設有一個類
public class Employee
{public int Id { get; set; }public string Name { get; set; }
}// 構建索引
var employees = new List<Employee>
{new Employee { Id = 1, Name = "Alice" },new Employee { Id = 2, Name = "Bob" },new Employee { Id = 3, Name = "Charlie" }
};// 創建索引
var employeeIndex = employees.ToDictionary(e => e.Id, e => e);// 查詢時使用索引
int searchId = 2;
if (employeeIndex.TryGetValue(searchId, out var employee))
{Console.WriteLine($"Found: {employee.Name}");
}
else
{Console.WriteLine("Not Found");
}

2. 預先分組以提高查詢性能

對于需要多次按某個字段查詢的場景,可以使用 Lookup<TKey, TElement> 預分組數據。Lookup 類似于 Dictionary,但支持一個鍵對應多個值。

示例代碼:
// 構建分組索引
var employeeLookup = employees.ToLookup(e => e.Name);// 按 Name 查詢
string searchName = "Alice";
foreach (var emp in employeeLookup[searchName])
{Console.WriteLine($"Found: {emp.Name} with Id: {emp.Id}");
}

3. 自定義數據結構

如果查詢條件多樣化,可以構建多字段索引,類似于復合索引。

示例代碼:
// 復合索引
var compositeIndex = employees.ToDictionary(e => (e.Id, e.Name), e => e);// 查詢
var key = (Id: 1, Name: "Alice");
if (compositeIndex.TryGetValue(key, out var result))
{Console.WriteLine($"Found: {result.Name}");
}

4. 排序后使用二分查找

如果 List<T> 是按查詢字段排序的,可以使用 BinarySearch 來快速查找。

示例代碼:
// 排序列表
employees = employees.OrderBy(e => e.Id).ToList();// 二分查找
int searchId = 2;
var found = employees.BinarySearch(new Employee { Id = searchId },Comparer<Employee>.Create((x, y) => x.Id.CompareTo(y.Id))
);if (found >= 0)
{Console.WriteLine($"Found: {employees[found].Name}");
}
else
{Console.WriteLine("Not Found");
}

5. 使用緩存優化查詢

如果查詢是頻繁且集中在某些字段上,可以構建一個緩存層,例如使用 MemoryCache

示例代碼:
using System.Runtime.Caching;// 創建緩存
var cache = MemoryCache.Default;
string cacheKey = "EmployeeById";
cache[cacheKey] = employeeIndex; // 使用之前構建的字典// 查詢緩存
if (cache.Contains(cacheKey))
{var cachedIndex = (Dictionary<int, Employee>)cache[cacheKey];if (cachedIndex.TryGetValue(2, out var cachedEmployee)){Console.WriteLine($"From Cache: {cachedEmployee.Name}");}
}

6. 結合并行查詢

對于大規模數據,可以結合并行 LINQ (PLINQ) 提高查詢速度。

示例代碼:
// 使用 PLINQ
var result = employees.AsParallel().Where(e => e.Name.StartsWith("A")).ToList();foreach (var emp in result)
{Console.WriteLine($"Found: {emp.Name}");
}

總結

加索引的方法需要根據具體場景選擇:

  • 如果查詢頻繁,使用 DictionaryLookup
  • 如果是多字段組合查詢,構建復合索引。
  • 如果數據較多且一次性查詢,考慮使用排序加二分查找。
  • 對于性能要求極高的場景,可以結合緩存或并行查詢優化。

根據你的需求,可以選用其中一個或多個組合方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62598.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62598.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62598.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一款免費、簡單、快速的JS打印插件,web 打印組件,基于JavaScript開發,支持數據分組,快速分頁批量預覽,打印,轉pdf,移動端,PC端

前言 在數字化辦公時代&#xff0c;打印需求呈現多樣化和復雜化的趨勢。現有的打印軟件往往存在cao作繁瑣、兼容性差、功能單一等問題&#xff0c;難以滿足現代企業高效、靈活的打印需求。 為了解決這些痛點&#xff0c;一款簡單、高效、多功能的打印插件成為了迫切需求。 介…

Python pywin32庫詳解

一、引言 在Python編程中&#xff0c;有時候需要與Windows操作系統進行交互&#xff0c;執行一些特定的系統操作或操作 Windows 應用程序。這時&#xff0c;pywin32庫就成為了一個非常強大的工具。pywin32庫提供了對Windows API的訪問&#xff0c;使得Python開發者能夠在Windo…

Uniapp的vue、nvue、uvue后綴名區別

在 UniApp 中&#xff0c;.vue、.nvue 和 .uvue 是不同的文件后綴名&#xff0c;每個文件格式的使用場景和兼容性略有不同。下面是每個文件后綴的詳細解釋以及它們的兼容性&#xff1a; 1. .vue 文件 定義&#xff1a;.vue 是標準的 Vue 單文件組件格式&#xff0c;主要用于基…

TCP/IP雜記

TCP三次握手、四次揮手 從應用角度&#xff0c;不用多考慮為什么有三次&#xff0c;遵循標準即可。 ubuntu 下 wireshark安裝&#xff1a; sudo add-apt-repository universe sudo apt install wireshark 三次握手實證&#xff1a; 第一次握手的情況如下&#xff1a;&#…

Vue前端開發-接收跳轉參數

路由攜帶參數跳轉到目標頁面后&#xff0c;頁面組件可以接收到攜帶傳入的參數&#xff0c;接收的方式與攜帶的方式相關&#xff0c;如果是采用查詢字符串方式攜帶&#xff0c;那么可以通過路由中的query對象獲取到參數&#xff0c;如果是其他方式&#xff0c;通常都是通過路由中…

力扣--LCR 177.撞色搭配

題目 整數數組 sockets 記錄了一個襪子禮盒的顏色分布情況&#xff0c;其中 sockets[i] 表示該襪子的顏色編號。禮盒中除了一款撞色搭配的襪子&#xff0c;每種顏色的襪子均有兩只。請設計一個程序&#xff0c;在時間復雜度 O(n)&#xff0c;空間復雜度O(1) 內找到這雙撞色搭配…

[ComfyUI]批量生成圖片的節點:輸入一個prompt列表批量生成圖像

文章目錄 1.參考資料2.兩個節點的部署FizzNodes節點comfyui-mixlab-nodes 生成的結果展示 1.參考資料 如何使用ComfyUI一次批量生成不同內容的圖片 ComfyUI工作流】隨機提示詞批量出圖&#xff0c;懶人刷圖福音&#xff0c;根據提示 2.兩個節點的部署 FizzNodes節點 fizzn…

【實操GPT-SoVits】聲音克隆模型圖文版教程

項目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速實操GPT-SoVits項目&#xff0c;不闡述技術原理&#xff08;后期如果有時間研究&#…

5G模組AT命令腳本-關閉模組的IP過濾功能

關閉模組的IP過濾功能 關閉模組的IP過濾功能 5G 模組通常使用nat方式為 下掛設備或上位機提供上網服務&#xff0c;默認情況&#xff0c;不做NAt的包無法經由 模組轉發&#xff0c;如果禁掉這個限制 &#xff0c;可使用本文中的配置命令本腳本用于關閉模組的IP過濾功能&#xf…

JAVA (Springboot) i18n國際化語言配置

JAVA i18n國際化語言配置 一、簡介二、功能三、Java配置國際化步驟四、Java國際化配置工具類五、Spring Boot配置六、測試 一、簡介 在Java中&#xff0c;國際化&#xff08;Internationalization&#xff0c;通常簡稱為i18n&#xff09;是一個過程&#xff0c;它允許應用程…

如何創建基于udp的客戶端和服務端

1.先創建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…

【上線文檔】系統上線方案模板,計算機系統上線保障計劃,系統運維信息系統運行保障方案,系統上線方案模板(Word原件)

一、項目背景和目標 二、項目需求分析 2.1 功能需求 2.2 非功能需求 三、系統設計 3.1 系統架構設計 3.2 數據庫設計 3.3 接口設計 3.4 用戶界面設計 四、系統開發 4.1 開發環境搭建 4.2 業務邏輯開發 4.3 數據庫實現 4.4 接口實現 4.5 用戶界面實現 五、系統測…

大模型應用的數字能源數據集

除了尚須時日的量子計算解決算力效率和能源問題&#xff0c;以及正在路上的超越transformer的全新模型架構外&#xff0c;無疑是“數據集”&#xff0c;準確講是“高質量大規模多樣性的數據集”。數據集是大模型發展的核心要素之一&#xff0c;是大計算的標的物&#xff0c;是實…

【OpenCV】圖像轉換

理論 傅立葉變換用于分析各種濾波器的頻率特性。對于圖像&#xff0c;使用 2D離散傅里葉變換&#xff08;DFT&#xff09; 查找頻域。快速算法稱為 快速傅立葉變換&#xff08;FFT&#xff09; 用于計算DFT。 Numpy中的傅立葉變換 首先&#xff0c;我們將看到如何使用Numpy查…

如何使用Java編寫Jmeter函數

Jmeter 自帶有各種功能豐富的函數&#xff0c;可以幫助我們進行測試&#xff0c;但有時候提供的這些函數并不能滿足我們的要求&#xff0c;這時候就需要我們自己來編寫一個自定義的函數了。例如我們在測試時&#xff0c;有時候需要填入當前的時間&#xff0c;雖然我們可以使用p…

【2024版】最新kali linux入門及常用簡單工具介紹(非常詳細)從零基礎入門到精通,看完這一篇就夠了

前言 相信很多同學了解到和學習網絡安全的時候都聽過kali系統&#xff0c;大家都稱之為黑客最喜愛的系統&#xff0c;那么什么是kali&#xff0c;初學者用kali能做些什么&#xff0c;大白我將在本文中做詳細的介紹&#xff1a; 一、kali linux是什么&#xff1f; Kali Linux…

使用 electron 把 vue 項目打包成客戶端

1. 新建一個Vue項目 新建一個vue項目&#xff0c;或者在已經寫好的vue項目上操作 2. 安裝依賴包 需要安裝的包有2個 electron electron-builder 安裝失敗的&#xff0c;可看另外一篇解決方法https://blog.csdn.net/Anorry/article/details/144061069?spm1001.2014.3001.5501 3…

六大排序算法:插入排序、希爾排序、選擇排序、冒泡排序、堆排序、快速排序

本章講述數據結構中的六大排序算法 歡迎大佬們踴躍討論&#xff0c;感謝大家支持&#xff01; 我的博客主頁鏈接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希爾排序 二.選擇排序2.1 單向選擇排序2.2雙向選擇排序2.3 堆排序 三.交換排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…

el-table手動觸發懶加載

二次修改了一下&#xff0c;確保點擊某一單元格格元素觸發 // 隱藏懶加載箭頭后手動觸發懶加載 expandRows(scope){scope.row.isExpanded !scope.row.isExpanded // 切換展開狀態let isExpanded scope.row.isExpandedconst { table: { toggleRowExpansion, store }} this.$r…

【MySQL】數據庫 Navicat 可視化工具與 MySQL 命令行基本操作

&#x1f4af; 歡迎光臨清流君的博客小天地&#xff0c;這里是我分享技術與心得的溫馨角落 &#x1f4af; &#x1f525; 個人主頁:【清流君】&#x1f525; &#x1f4da; 系列專欄: 運動控制 | 決策規劃 | 機器人數值優化 &#x1f4da; &#x1f31f;始終保持好奇心&…