zoukankan      html  css  js  c++  java
  • c# this关键字用法

    • 用法1 为原始类型扩展方法

    先说一下,this 后面跟的类型,就是要拓展方法的类型。注意要写在静态类中的静态方法,不然有些情况下访问

     1 /// <summary>
     2     /// 扩展类 用于为原始类扩展方法  
     3     /// </summary>
     4    public static class AM_Extends
     5     {
     6         /// <summary>
     7         /// 为string类扩展了一个child方法,实现某功能
     8         /// </summary>
     9         /// <param name="str"></param>
    10         /// <param name="new_str"></param>
    11         public static void Child( this string str,string new_str)
    12         {
    13             object obj = str;
    14             str=new_str;
    15         }
    16     }
    定义扩展方法
    1 private void Form1_Load(object sender, EventArgs e)
    2         {
    3             string st1 = "123";
    4             string st2 = "";
    5             string st3 = "";
    6             st3 = st2.Child(st1);//st3的值为“123”
    7         }
    调用实例
    • 用法2 this代表当前类的实例对象
    • 用法3 用this串联构造函数
     1    public class Test
     2     {
     3         public Test()
     4         {
     5             Console.WriteLine("无参构造函数");
     6         }
     7         // this()对应无参构造方法Test()
     8      // 先执行Test(),后执行Test(string text)
     9         public Test(string text) : this()
    10         {
    11             Console.WriteLine(text);
    12             Console.WriteLine("有参构造函数");
    13         }
    14     }
    View Code
    • 用法4 索引器(基于索引器封装EPList,用于优化大数据下频发的Linq查询引发的程序性能问题,通过索引从list集合中查询数据)
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Reflection;
      5 using System.Text;
      6 
      7 namespace MyDemo.Web
      8 {
      9     /// <summary>
     10     /// EPList 支持为List创建索引
     11     /// </summary>
     12     /// <typeparam name="T">类型</typeparam>
     13     public class EPList<T>
     14     {
     15         #region 成员变量
     16 
     17         /// <summary>
     18         /// 索引
     19         /// </summary>
     20         private List<string[]> m_Index = new List<string[]>();
     21 
     22         /// <summary>
     23         /// 缓存数据
     24         /// </summary>
     25         private Dictionary<string, List<T>> m_CachedData = new Dictionary<string, List<T>>();
     26 
     27         /// <summary>
     28         /// List数据源
     29         /// </summary>
     30         private List<T> m_ListData = new List<T>();
     31 
     32         /// <summary>
     33         /// 通过索引值取数据
     34         /// </summary>
     35         /// <param name="indexFields">索引字段</param>
     36         /// <param name="fieldValues">字段值</param>
     37         /// <returns></returns>
     38         public List<T> this[string[] indexFields]
     39         {
     40             get
     41             {
     42                 string key = string.Join(",", indexFields);
     43                 if (m_CachedData.ContainsKey(key)) return m_CachedData[key];
     44                 return new List<T>();
     45             }
     46         }
     47 
     48         #endregion
     49 
     50         #region 公共方法
     51 
     52         /// <summary>
     53         /// 创建索引
     54         /// </summary>
     55         /// <param name="indexFields">索引字段</param>
     56         public void CreateIndex(string[] indexFields)
     57         {
     58             if (m_Index.Contains(indexFields)) return;
     59             m_Index.Add(indexFields);
     60         }
     61 
     62         /// <summary>
     63         /// 添加
     64         /// </summary>
     65         /// <param name="record">记录</param>
     66         public void Add(T record)
     67         {
     68             m_ListData.Add(record);
     69             m_Index.ForEach(indexFields =>
     70             {
     71                 string key = getKey(record, indexFields);
     72                 if (m_CachedData.ContainsKey(key))
     73                 {
     74                     m_CachedData[key].Add(record);
     75                 }
     76                 else
     77                 {
     78                     List<T> list = new List<T> { record };
     79                     m_CachedData.Add(key, list);
     80                 }
     81             });
     82         }
     83 
     84         #endregion
     85 
     86         #region 私有方法
     87 
     88         /// <summary>
     89         /// 获取值
     90         /// </summary>
     91         /// <param name="record">记录</param>
     92         /// <param name="fieldName">字段名</param>
     93         /// <returns></returns>
     94         private object getValue(T record, string fieldName)
     95         {
     96             Type type = typeof(T);
     97             PropertyInfo propertyInfo = type.GetProperty(fieldName);
     98             return propertyInfo.GetValue(record, null);
     99         }
    100 
    101         /// <summary>
    102         /// 获取Key
    103         /// </summary>
    104         /// <param name="record">记录</param>
    105         /// <param name="indexFields">索引字段</param>
    106         private string getKey(T record, string[] indexFields)
    107         {
    108             List<string> values = new List<string>();
    109             foreach (var field in indexFields)
    110             {
    111                 string value = Convert.ToString(getValue(record, field));
    112                 values.Add(field + ":" + value);
    113             }
    114             return string.Join(",", values);
    115         }
    116 
    117         /// <summary>
    118         /// 获取Key
    119         /// </summary>
    120         /// <param name="indexFields">索引字段</param>
    121         /// <param name="fieldValues">字段值</param>
    122         /// <returns></returns>
    123         private string getKey(string[] indexFields, object[] fieldValues)
    124         {
    125             if (indexFields.Length != fieldValues.Length) return string.Empty;
    126             for (int i = 0; i < indexFields.Length; i++)
    127             {
    128                 fieldValues[i] = indexFields[i] + ":" + fieldValues[i];
    129             }
    130             string key = string.Join(",", fieldValues);
    131             return key;
    132         }
    133 
    134         #endregion
    135     }
    136 }
    创建EPList
     1 private EPList<SysDepartInfo> GetEPListData()
     2 {
     3     EPList<SysDepartInfo> eplist = new EPList<SysDepartInfo>();
     4     eplist.CreateIndex(new string[] { "ParentId" });
     5     string sql = "select Id,ParentId,Code,Name from SysDepart";
     6     SqlHelper.ExecuteReader(sql, null, (reader) =>
     7     {
     8         SysDepartInfo record = new SysDepartInfo();
     9         record.Id = Convert.ToString(reader["Id"]);
    10         record.ParentId = Convert.ToString(reader["ParentId"]);
    11         record.Code = Convert.ToString(reader["Code"]);
    12         record.Name = Convert.ToString(reader["Name"]);
    13         eplist.Add(record);
    14     });
    15     return eplist;
    16 }
    给EPList创建索引,并添加数据
     1 /// <summary>
     2 /// 获取子节点
     3 /// </summary>
     4 /// <param name="data"></param>
     5 /// <param name="parentId"></param>
     6 private IEnumerable<TreeInfo> CreateChildren(EPList<SysDepartInfo> data, TreeInfo node)
     7 {
     8     string id = node == null ? "0" : node.id;
     9     List<TreeInfo> childNodes = new List<TreeInfo>();
    10     // ParentId字段上创建了索引,所以这里就可以通过索引值直接取出下一层子节点数据,避免Linq查询引发的效率问题
    11     var indexValues = new string[] { "ParentId:" + id };
    12     var childData = data[indexValues];
    13     childData.ForEach(record =>
    14     {
    15         var childNode = new TreeInfo
    16         {
    17             id = record.Id,
    18             text = record.Code + " " + record.Name
    19         };
    20         childNodes.Add(childNode);
    21         childNode.children = CreateChildren(data, childNode);
    22     });
    23     return childNodes.OrderBy(record => record.text);
    24 }
    通过索引高效查询数据

    参考文献:   https://www.cnblogs.com/yellowcool/p/7908607.html

     

     

     

     

     

     

  • 相关阅读:
    bzoj1027 状压dp
    CodeForces755F 贪心 + 多重背包二进制优化
    CodeForces632E 神奇的多重背包
    POJ3662 SPFA//二分 + 双端队列最短路
    bzoj1233 单调队列优化dp
    POJ3417 LCA+树dp
    Network
    树网的核/[SDOI2011]消防
    [APIO2010]巡逻
    核心城市
  • 原文地址:https://www.cnblogs.com/MatureMan/p/12303347.html
Copyright © 2011-2022 走看看