C#语法手册

索引器语法


索引器类似于属性。 很多时候,创建索引器与创建属性所使用的编程语言特性是一样的。

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

namespace CSGDemo.CSG017
{
    //https://docs.microsoft.com/zh-cn/dotnet/csharp/indexers


    public class DataObject
    {
        public string Name { get; set; }
        public int Count { get; set; }
        public string Value { get; set; }
    }


    //#csg017-01,声明一个索引器
    //索引器 类似于属性。多数的情况下,创建索引器与创建属性所使用的编程语言特性是一样的。
    public class DemoClass1
    {
        private List<DataObject> datas { get; set; }

        //#csg017-01,声明索引器
        public DataObject this[string key]
        {
            get { return datas.Where(datas => datas.Name == key).FirstOrDefault(); }
            set
            {
                var data = datas.Where(datas => datas.Name == key).FirstOrDefault();
                data = value;
            }
        }


        //#csg017-02,声明多参数索引器,可以声明多个不同参数的索引器
        public DataObject this[string key, int count]
        {
            get { return datas.Where(d => d.Name == key && d.Count == count).FirstOrDefault(); }
            set
            {
                var data = datas.Where(d => d.Name == key && d.Count == count).FirstOrDefault();
                data = value;
            }
        }

    }


    public class DemoClass2
    {
        private List<DataObject> datas { get; set; }

        //#csg017-03
        //若索引值在集合中找不到,可以抛出 ArgumentOutOfRangeException 异常
        public DataObject this[string key]
        {
            get
            {
                if (string.IsNullOrEmpty(key)) { throw new ArgumentOutOfRangeException("your key is not exist"); }
                return datas.Where(datas => datas.Name == key).FirstOrDefault();
            }
            set
            {
                var data = datas.Where(datas => datas.Name == key).FirstOrDefault();
                data = value;
            }
        }

    }



    public class DemoClass3
    {
        public DemoClass3()
        {
            //#csg017-04
            //使用索引器
            var class1 = new DemoClass1();
            var d = class1["key"];

            var d2 = class1["key", 3];
        }
    }



    public class DemoClass4
    {

        public DemoClass4()
        {

            var list = new string[] { "a", "b", "c", "d", "e", "f" };

            //C# 8.0 新添加的索引使用语法,反向索引与范围索引
            //#csg017-05
            //"^"操作符,System.Index,从后面开始索引集合
            var a = list[^1];
            //第二种使用方法
            Index i = ^1;
            var a1 = list[i];
            //f


            //#csg017-06
            //".."操作符,System.Range,集合切片
            var b = list[2..4];
            //第二种使用方法
            Range r = 2..4;
            var b1 = list[r];
            //c,d


            //#csg017-07
            //"^" 与 ".." 结合使用
            var c = list[1..^0];
            //第二种使用方法
            Range x = 1..^0;
            var c1 = list[x];
            //b,c,d,e,f

        }

    }


}