C#性能优化篇 - 基于索引器封装EPList
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text; namespace MyDemo.Web
{
/// <summary>
/// EPList 支持为List创建索引
/// </summary>
/// <typeparam name="T">类型</typeparam>
public class EPList<T>
{
#region 成员变量 /// <summary>
/// 索引
/// </summary>
private List<string[]> m_Index = new List<string[]>(); /// <summary>
/// 缓存数据
/// </summary>
private Dictionary<string, List<T>> m_CachedData = new Dictionary<string, List<T>>(); /// <summary>
/// List数据源
/// </summary>
private List<T> m_ListData = new List<T>(); /// <summary>
/// 通过索引值取数据
/// </summary>
/// <param name="indexFields">索引字段</param>
/// <param name="fieldValues">字段值</param>
/// <returns></returns>
public List<T> this[string[] indexFields]
{
get
{
string key = string.Join(",", indexFields);
if (m_CachedData.ContainsKey(key)) return m_CachedData[key];
return new List<T>();
}
} #endregion #region 公共方法 /// <summary>
/// 创建索引
/// </summary>
/// <param name="indexFields">索引字段</param>
public void CreateIndex(string[] indexFields)
{
if (m_Index.Contains(indexFields)) return;
m_Index.Add(indexFields);
} /// <summary>
/// 添加
/// </summary>
/// <param name="record">记录</param>
public void Add(T record)
{
m_ListData.Add(record);
m_Index.ForEach(indexFields =>
{
string key = getKey(record, indexFields);
if (m_CachedData.ContainsKey(key))
{
m_CachedData[key].Add(record);
}
else
{
List<T> list = new List<T> { record };
m_CachedData.Add(key, list);
}
});
} #endregion #region 私有方法 /// <summary>
/// 获取值
/// </summary>
/// <param name="record">记录</param>
/// <param name="fieldName">字段名</param>
/// <returns></returns>
private object getValue(T record, string fieldName)
{
Type type = typeof(T);
PropertyInfo propertyInfo = type.GetProperty(fieldName);
return propertyInfo.GetValue(record, null);
} /// <summary>
/// 获取Key
/// </summary>
/// <param name="record">记录</param>
/// <param name="indexFields">索引字段</param>
private string getKey(T record, string[] indexFields)
{
List<string> values = new List<string>();
foreach (var field in indexFields)
{
string value = Convert.ToString(getValue(record, field));
values.Add(field + ":" + value);
}
return string.Join(",", values);
} /// <summary>
/// 获取Key
/// </summary>
/// <param name="indexFields">索引字段</param>
/// <param name="fieldValues">字段值</param>
/// <returns></returns>
private string getKey(string[] indexFields, object[] fieldValues)
{
if (indexFields.Length != fieldValues.Length) return string.Empty;
for (int i = ; i < indexFields.Length; i++)
{
fieldValues[i] = indexFields[i] + ":" + fieldValues[i];
}
string key = string.Join(",", fieldValues);
return key;
} #endregion
}
}
给EPList创建索引,并添加数据
private EPList<SysDepartInfo> GetEPListData()
{
EPList<SysDepartInfo> eplist = new EPList<SysDepartInfo>();
eplist.CreateIndex(new string[] { "ParentId" });
string sql = "select Id,ParentId,Code,Name from SysDepart";
SqlHelper.ExecuteReader(sql, null, (reader) =>
{
SysDepartInfo record = new SysDepartInfo();
record.Id = Convert.ToString(reader["Id"]);
record.ParentId = Convert.ToString(reader["ParentId"]);
record.Code = Convert.ToString(reader["Code"]);
record.Name = Convert.ToString(reader["Name"]);
eplist.Add(record);
});
return eplist;
}
通过索引高效查询数据
/// <summary>
/// 获取子节点
/// </summary>
/// <param name="data"></param>
/// <param name="parentId"></param>
private IEnumerable<TreeInfo> CreateChildren(EPList<SysDepartInfo> data, TreeInfo node)
{
string id = node == null ? "" : node.id;
List<TreeInfo> childNodes = new List<TreeInfo>();
// ParentId字段上创建了索引,所以这里就可以通过索引值直接取出下一层子节点数据,避免Linq查询引发的效率问题
var indexValues = new string[] { "ParentId:" + id };
var childData = data[indexValues];
childData.ForEach(record =>
{
var childNode = new TreeInfo
{
id = record.Id,
text = record.Code + " " + record.Name
};
childNodes.Add(childNode);
childNode.children = CreateChildren(data, childNode);
});
return childNodes.OrderBy(record => record.text);
}
C#性能优化篇 - 基于索引器封装EPList的更多相关文章
- 《MySQL性能优化篇》阅读笔记
建表的时候,不要用null赋默认值,如:字符串的设置'',数据类型的设为0,不要将null设为默认值. 在MySQL中没有 full [outer] join,用union代替 各种 JOIN SQL ...
- MySQL性能优化(三):索引
原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...
- JavaScript性能优化篇js优化
JavaScript性能优化篇js优化 随着Ajax越来越普遍,Ajax引用的规模越来越大,Javascript代码的性能越来越显得重要,我想这就是一个很典型的例子,上面那段代码因为会被频繁使用, ...
- JVM性能优化系列-(2) 垃圾收集器与内存分配策略
2. 垃圾收集器与内存分配策略 垃圾收集(Garbage Collection, GC)是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如 ...
- jQuery性能优化篇
jQuery高级技巧——性能优化篇 阅读目录 通过CDN(Content Delivery Network)引入jQuery库 减少DOM操作 适当使用原生JS 选择器优化 缓存jQuery对象 定义 ...
- 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十四)
转载自:http://www.cyqdata.com/qblog/article-detail-38993 文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文 ...
- 转:Hive性能优化之ORC索引–Row Group Index vs Bloom Filter Index
之前的文章<更高的压缩比,更好的性能–使用ORC文件格式优化Hive>中介绍了Hive的ORC文件格式,它不但有着很高的压缩比,节省存储和计算资源之外,还通过一个内置的轻量级索引,提升查询 ...
- SqlServer性能优化 查询和索引优化(十二)
查询优化的过程: 查询优化: 功能:分析语句后最终生成执行计划 分析:获取操作语句参数 索引选择 Join算法选择 创建测试的表: select * into EmployeeOp from Adve ...
- 数据库性能优化:SQL索引
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...
随机推荐
- PHP 作用域
- HDU 1423 Greatest Common Increasing Subsequence(LCIS)
Greatest Common Increasing Subsequenc Problem Description This is a problem from ZOJ 2432.To make it ...
- Memory loss【记忆缺失】
Memory Loss Losing your ability to think and remember is pretty scary. We know the risk of dementia ...
- 后缀数组的使用心得——POJ2774 最长连续公共子串
对于这道题,将两个字符串直接合并成为一个字符串,分别记录连个字符串结束的位置. 首先,应用黑暗圣典的模板,我们可以顺利得到height,rank,sa三个数组. 之后直接扫描1-n所有的位置,选出来一 ...
- 使用FileSystem类进行文件读写及查看文件信息
使用FileSystem类进行文件读写及查看文件信息 在这一节我们要深入了解Hadoop的FileSystem类——这是与与hadoop的文件系统交互的重要接口.虽然我们只是着重于HDFS的实现, ...
- RDD算子、RDD依赖关系
RDD:弹性分布式数据集, 是分布式内存的一个抽象概念 RDD:1.一个分区的集合, 2.是计算每个分区的函数 , 3.RDD之间有依赖关系 4.一个对于key-value的RDD的Partit ...
- 我给女朋友讲编程CSS系列(3) CSS如何设置字体的类型、大小、颜色,如何使用火狐浏览器的Firebug插件查看网页的字体
一.CSS如何设置字体的类型.大小.颜色 设计网页时,一般设置body的字体,让其他标签继承body的字体,这样设置特别方便,但是标题标签h1到h6和表单标签(input类型)是没有继承body的字体 ...
- leetcode 【 Find Peak Element 】python 实现
题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...
- 几种常见的Android自动化测试框架及其应用
随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的 ...
- Python+Selenium练习篇之13-获取当前页面的URL
本文介绍如何通过webdriver方法获取当前测试页面的URL.获取当前URL有什么用处呢,一般URL可以帮助我们判断跳转的页面是否正确,或者URL中部分字段可以作为我们自动化测试脚本期待结果的一部分 ...