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
}
}
}