勇哥的C#知识经验圈点:索引器

勇哥注:

这个系列的贴子主要是为了培训用(专职自动化设备的C#软件工程师),因此例子的知识范围被限制在行业范围内。

C#基础知识在网上是最多的存在,不足主要下面几点:

1. 内容零碎,没有大纲来组织
2. 什么功能都有讲,就是没有按实际项目的常用程度来组织
3. PLC转上位机的人员,很难把PLC的编程思想转到C#编程上来,需要在知识点讲解上对此问题有点拔

勇哥的这套贴子会有大纲,主要特点是补足以上几点问题,另外本套贴子属于经验性质的圈点知识,不属于完全小白式的教学。

如果读者有好的意见,请留言反馈。



索引器


   索引器是C#中一种特殊的成员,它使用类似数组的
   语法来访问类或结构的元素,就像数组一样。


演示代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp2
{

    /*
   索引器是C#中一种特殊的成员,它使用类似数组的
   语法来访问类或结构的元素,就像数组一样。
   演示:勇哥

    */
    public class Class索引器
    {
        //用索引器访问数组和二维数组
        string[] names = new string[10];
        string[,] newNames = new string[4, 4];
        public string this[int index]
        {
            get { return names[index]; }
            set { names[index] = value; }
        }

        //这里演示了多个参数的索引器用法
        public string this[int row, int col]
        {
            get
            {
                return newNames[row, col];
            }
            set
            {
                newNames[row, col] = value;
            }
        }


    }

    public class Class索引器2
    {
        //下面演示了索引器用来分别读取字典的key和value
        //注意这里比较有意义的是我们可以由字典的value返回key,这样索引器
        //就封装了遍历查询的动作,外部使用起来就方便很多。这也是对字典应
        //用索引器的实际意义
        Dictionary<string, int> dic = new Dictionary<string, int>();
        public int this[string keyName]
        {
            get { return dic[keyName]; }
            set { dic[keyName] = value; }
        }

        public string this[int indexValue]
        {
            get
            {
                foreach (var m in dic)
                {
                    if (m.Value == indexValue)
                        return m.Key;
                }
                return "";
            }
            set
            {
                //要考虑字典是否有key
                if (dic.ContainsKey(value))
                    dic[value] = indexValue;
                else
                    dic.Add(value, indexValue);
            }
        }

    }

    public class Class索引器3
    {
        //演示如何用索引器读写类的属性
        //这个例子只是表示可以这样用,但是意义不太大。
        private List<People> list1 = new List<People>();
        public object this[PeopleEnum fName, int index]
        {
            get
            {
                object v = null;
                if (fName == PeopleEnum.Name)
                    v = list1[index].Name;
                else if (fName == PeopleEnum.Age)
                    v = list1[index].Age;

                return v;
            }
            set
            {
                if (fName == PeopleEnum.Name)
                {
                    if (list1.Count >= index + 1)
                    {
                        list1[index].Name = value.ToString();
                    }
                    else
                    {
                        list1.Add(new People() { Name = value.ToString() });
                    }
                }
                else if (fName == PeopleEnum.Age)
                {
                    if (list1.Count >= index + 1)
                    {
                        list1[index].Age = (int)value;
                    }
                    else
                    {
                        list1.Add(new People() { Age = (int)value });
                    }
                }

            }
        }
    }


    public class Class索引器4
    {
        //演示了索引器索引器在接口方面的应用
        //这样我们就可以按索引返回方法,这是一种非常常见的用法。
        
        private Dictionary<SymbolEnum, ICalMethod> method = 
            new Dictionary<SymbolEnum, ICalMethod>();

        public Class索引器4()
        {
             //这里用索引器的set方法初始化内部的几组计算方法
             //注意在外部使用的时候,还可以由用户set自己的计算方法,这显示出了灵活性
            this[SymbolEnum.加法] = new MethodAdd();
            this[SymbolEnum.减法] = new MethodSub();
            this[SymbolEnum.乘法] = new MethodMul();
        }

        public ICalMethod this[SymbolEnum methodName]
        {
            get
            {
                if (method.ContainsKey(methodName))
                    return method[methodName];
                else return null;
            }
            set
            {
                if (method.ContainsKey(methodName))
                    method[methodName] = value;
                else
                    method.Add(methodName, value);
            }
        }
    }

        public enum SymbolEnum
        {
            加法 = 0, 减法, 乘法
        }

    public class MethodAdd : ICalMethod
    {

        public int CalResult(int data1, int data2)
        {
            return data1 + data2;
        }
    }

    public class MethodSub : ICalMethod
    {
        public int CalResult(int data1, int data2)
        {
            return data1 - data2;
        }
    }

    public class MethodMul : ICalMethod
    {
        public int CalResult(int data1, int data2)
        {
            return data1 * data2;
        }
    }


    public interface ICalMethod
    {
        int CalResult(int data1, int data2);
    }


    public enum PeopleEnum
    {
        Name, Age
    }

    public class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

调用者:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
  

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Class索引器 p = new Class索引器();
            p[0] = "张三";
            p[1] = "李四";
            p[1, 2] = "1行3列";
            p[2, 3] = "2行3列";

            Class索引器2 m = new Class索引器2();
            m["张三"] = 15;
            m["李四"] = 20;
            var name1 = m[15];
            var name2 = m[20];

            Class索引器3 k = new Class索引器3();
            k[PeopleEnum.Name,0] = "张飞";
            k[PeopleEnum.Age, 0] = 33;

            k[PeopleEnum.Name, 1] = "赵云";
            k[PeopleEnum.Age, 1] = 23;

            var m1 = k[PeopleEnum.Name, 0];
            var m2 = k[PeopleEnum.Age, 0];


            Class索引器4 method = new Class索引器4();
            var r1 = method[SymbolEnum.加法].CalResult(11, 12);
            var r2 = method[SymbolEnum.减法].CalResult(50, 20);
            var r3 = method[SymbolEnum.乘法].CalResult(10, 10);
        }
    }
}


--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年5月    »
12345
6789101112
13141516171819
20212223242526
2728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864