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的更多相关文章

  1. 《MySQL性能优化篇》阅读笔记

    建表的时候,不要用null赋默认值,如:字符串的设置'',数据类型的设为0,不要将null设为默认值. 在MySQL中没有 full [outer] join,用union代替 各种 JOIN SQL ...

  2. MySQL性能优化(三):索引

    原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...

  3. JavaScript性能优化篇js优化

    JavaScript性能优化篇js优化   随着Ajax越来越普遍,Ajax引用的规模越来越大,Javascript代码的性能越来越显得重要,我想这就是一个很典型的例子,上面那段代码因为会被频繁使用, ...

  4. JVM性能优化系列-(2) 垃圾收集器与内存分配策略

    2. 垃圾收集器与内存分配策略 垃圾收集(Garbage Collection, GC)是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如 ...

  5. jQuery性能优化篇

    jQuery高级技巧——性能优化篇 阅读目录 通过CDN(Content Delivery Network)引入jQuery库 减少DOM操作 适当使用原生JS 选择器优化 缓存jQuery对象 定义 ...

  6. 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十四)

    转载自:http://www.cyqdata.com/qblog/article-detail-38993 文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文 ...

  7. 转:Hive性能优化之ORC索引–Row Group Index vs Bloom Filter Index

    之前的文章<更高的压缩比,更好的性能–使用ORC文件格式优化Hive>中介绍了Hive的ORC文件格式,它不但有着很高的压缩比,节省存储和计算资源之外,还通过一个内置的轻量级索引,提升查询 ...

  8. SqlServer性能优化 查询和索引优化(十二)

    查询优化的过程: 查询优化: 功能:分析语句后最终生成执行计划 分析:获取操作语句参数 索引选择 Join算法选择 创建测试的表: select * into EmployeeOp from Adve ...

  9. 数据库性能优化:SQL索引

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

随机推荐

  1. Android Studio 3.0 安装注意点

    在安装Android studio 3.0+ 时候,会遇到默认不带Android SDK 的问题. 在启动Android studio 后,会提示让选择SDK目录,选择下载目录,对应的去下载 那么问题 ...

  2. Oracle redo与undo 第二弹

    首先看一下undo与redo的字面意思:   undo:撤销,也就是取消之前的操作.   redo:重做,重新执行一遍之前的操作. 什么是REDO REDO记录transaction logs,分为o ...

  3. C++ vector 实例

    #include <string> #include <iostream> #include <vector> #include <algorithm> ...

  4. json对象数据列数

    // var len = data.length(); // alert(data.Rows.length); var colCount = (function count(){//一条记录中有几个键 ...

  5. Android TV 开发(4)

    本文来自网易云社区 作者:孙有军 最后我们再来看看好友界面,改界面本地是没有xml的,因此我们直接来看看代码: 这里将使用到数据bean,与数据源的代码也贴出来如下: public class Con ...

  6. Selenium 中 高亮元素

    //高亮元素 WebElement  element = driver.findElement(By.cssSelector(".table1 .btn-public label" ...

  7. HDU5726 GCD

    Give you a sequence of N(N≤100,000)N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000)a1,...,an( ...

  8. hadoop配置文件: hdfs-site.xml, mapred-site.xml

    dfs.name.dir Determines where on the local filesystem the DFS name node should store the name table( ...

  9. maven学习(十五)——在eclipse中使用maven创建javaweb项目

    一.创建Web项目 1.1 选择建立Maven Project 选择File -> New ->Project,如下图所示:

  10. Strut 2 ValueStack传送带机制

    源码与jar包下载(将rar改成jar,直接放在WEB_INF\lib目录中即可)    众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数.Action配置参数.向其他 ...