C# 索引器 学习
转载原地址: http://www.cnblogs.com/lxblog/p/3940261.html
1、索引器(Indexer):
索引器允许类或者结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于他们的访问采用参数。
最简单的索引器的使用
/// <summary>
/// 最简单的索引器
/// </summary>
public class IDXer
{
private string[] name=new string[]; //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
public string this[int index]
{
get
{
return name[index];
}
set
{
name[index] = value;
}
}
} public class Program
{
static void Main(string[] args)
{
//最简单索引器的使用
IDXer indexer = new IDXer();
//“=”号右边对索引器赋值,其实就是调用其set方法
indexer[] = "张三";
indexer[] = "李四";
//输出索引器的值,其实就是调用其get方法
Console.WriteLine(indexer[]);
Console.WriteLine(indexer[]);
Console.ReadKey();
}
}
2、索引器与数组的区别:
- 索引器的索引值(Index)类型不限定为整数:
用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型可以定义为其他类型。
- 索引器允许重载
一个类不限定为只能定义一个索引器,只要索引器的函数签名不同,就可以定义多个索引器,可以重载它的功能。
- 索引器不是一个变量
索引器没有直接定义数据存储的地方,而数组有。索引器具有Get和Set访问器。
3、索引器与属性的区别:
- 索引器以函数签名方式 this 来标识,而属性采用名称来标识,名称可以任意
- 索引器可以重载,而属性不能重载。
- 索引器不能用static 来进行声明,而属性可以。索引器永远属于实例成员,因此不能声明为static。
以字符串作为下标,对索引器进行存取:
//以字符串为下标的索引器
public class IDXer2
{
private Hashtable name = new Hashtable(); //以字符串为下标的索引器
public string this[string index]
{
get
{
return name[index].ToString();
}
set
{
name.Add(index, value);
}
}
} public class Program
{
static void Main(string[] args)
{
//以字符串为下标的索引器
IDXer2 indexer2 = new IDXer2();
indexer2["A01"] = "张三";
indexer2["A02"] = "李四";
Console.WriteLine(indexer2["A01"]);
Console.WriteLine(indexer2["A02"]);
Console.ReadKey();
}
}
多参数索引器及索引器的重载
/// <summary>
/// 成绩类
/// </summary>
public class Scores
{
/// <summary>
/// 学生姓名
/// </summary>
public string StuName { get; set; } /// <summary>
/// 课程ID
/// </summary>
public int CourseId { get; set; } /// <summary>
/// 分数
/// </summary>
public int Score { get; set; } } /// <summary>
/// 查找成绩类(索引器)
/// </summary>
public class FindScore
{
private List<Scores> listScores; public FindScore()
{
listScores = new List<Scores>();
} //索引器 通过名字&课程编号查找和保存成绩
public int this[string stuName, int courseId]
{
get
{
Scores s = listScores.Find(x => x.StuName == stuName && x.CourseId == courseId);
if (s != null)
{
return s.Score;
}
else
{
return -1;
}
}
set
{
listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value });
}
} //索引器重载,根据名字查找所有成绩
public List<Scores> this[string stuName]
{
get
{
List<Scores> tempList = listScores.FindAll(x => x.StuName == stuName);
return tempList;
}
}
} static void Main(string[] args)
{
//多参数索引器和索引器重载
FindScore fScore = new FindScore();
fScore["张三", 1] = 98;
fScore["张三", 2] = 100;
fScore["张三", 3] = 95;
fScore["李四", 1] = 96;
//查找 张三 课程编号2 的成绩
Console.WriteLine("李四 课程编号2 成绩为:" + fScore["李四", 1]);
//查找所有张三的成绩
List<Scores> listScores = fScore["张三"];
if (listScores.Count > 0)
{
foreach (Scores s in listScores)
{
Console.WriteLine(string.Format("张三 课程编号{0} 成绩为:{1}", s.CourseId, s.Score));
}
}
else
{
Console.WriteLine("无该学生成绩单");
}
Console.ReadKey();
}
C# 索引器 学习的更多相关文章
- C#索引器学习笔记
本笔记摘抄自:https://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html,记录一下学习过程以备后续查用. 索引器允许类或者结构的实 ...
- C#学习-索引器
当一个类包含数组成员时,索引器的使用将大大地简化对类中数组成员的访问. 索引器的定义类似于属性,也具有get访问器和set访问器,以下是 [修饰符] 数据类型 this [索引类型index] { g ...
- C#学习笔记(十六):索引器和重载运算符
二维数组如何映射到一维数组 重载运算符 1.算术运算符 2.关系运算符, < 和 > 成对重载 using System; using System.Collections.Generic ...
- C#中索引器Indexer的学习使用
索引器 顾名思义,是用来索引的,那么C#中索引器是用来索引什么的呢 首先我们知道,C#中的数组是本身就可以索引的,那么C#中的类和结构呢,类和结构的实例是无法索引的,如果我们想让C#中类或者结构的实例 ...
- 接口、索引器、Foreach的本质(学习笔记)
接口 什么是接口? 接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高! 接口的定义: public interface IEat//定义一个接口 { void Eat(string food); ...
- C# 索引器(C#学习笔记05)
索引器 索引器能够使对象像数组一样被索引,使用数组的访问方式 object[x] 索引器的声明在某种程度上类似于属性的声明,例如,使用 get 和 set 方法来定义一个索引器. 不同的是,属性值的定 ...
- 【c# 学习笔记】索引器
当一个类包含数组成员时,索引器 的使用将大大地简化对类中数组成员的访问.索引器的定义类似于属性,也具有GET访问器和set访问器,如下: [修饰符] 数据类型 this[索引类型 index] { g ...
- public animal this[int index]|索引器的使用
学习如何使用索引器,索引器的使用是public 类型 this[int index]{get{};set{}} ,访问通过类的实例(对象)加[i], 例如animal[i],就像访问数组一样,其实就是 ...
- C#中的索引器(Indexers)
前两天刚刚学习完了属性,这两天又搂完了索引器,发现两者非常的相似,但是相似之外还有一些不同之处.今天就来总结一下索引器--Indexers 索引器的作用及格式 索引器的作用就是能够使类或者结构体的实例 ...
随机推荐
- tahoma字体对中文字的影响
一提到tahoma字体大家都会想到,它是一个英文字体,对中文不会有影响. 但是今天就遇到一个问题,tahoma字体会影响中文字的显示,如: html代码: <div class="bo ...
- Web内容管理系统 Magnolia 介绍-挖掘优良的架构(1)
Magnolia简介: Magnolia CMS是一家瑞士公司自2003年起发布的一个基于Java的开源内容管理系统.它适合且已被使用在以下领域:电子商务(例如:COOP.Migros.Rossman ...
- ZOJ 1610 Count the Colors (线段树 成段更新)
题目链接 题意:成段染色,初始为0,每次改变一个区间的颜色,求最后每种颜色分别有多少段.颜色按照从 小到大输出. 分析:改变了代码的风格,因为看了学长的博客.直接用数组,可以只是记录节点的编号,因为节 ...
- bzoj3272 3638
好题,这道题可以用线段树来快速模拟费用流寻找最长增广路 这样修改怎么做也很显然了 type node=record s,lx,rx,mx,lp,rp,pb,pe:longint; end; ..*,. ...
- 纯css做的安卓开机动画
随着css3的发展,越来越多的负责绚丽的效果可以由纯css来完成了.用css3实现的动画效果丝毫不必js实现的逊色,而且浏览器对css渲染的速度远比js快,大多数时候css的体积也不js小.其中css ...
- Oracle 课程七之分析和动态采样
课程目标 完成本课程的学习后,您应该能够: •引子—统计信息的作用 •如何收集统计信息 •系统统计信息 •对象统计信息—表.字段.索引统计信息 •动态采样 统计信息的作用 Optimizer st ...
- Oracle DBA 的常用Unix参考手册(二)
9.AIX下显示CPU数量 # lsdev -C|grep Process|wc -l10.Solaris下显示CPU数量# psrinfo -v|grep "Status of pr ...
- Android-AnimationDrawable(三)运行的几种方式
项目开发用到了AnimationDrawable,调用start后没有运行,很纳闷.google搜了下.记录一下. 这个AnimationDrawable.start不能直接写在onClick,onS ...
- 利用ioctl()获取无线速率
其实对于自己装了网卡驱动的来说,应该从最根本的驱动中获取速率. 但是用ioctl()也可以,其实实现和iwconfig命令相同. 仅仅获取速率这部分: #include <stdio.h> ...
- 【转载】ACM总结——dp专辑
感谢博主—— http://blog.csdn.net/cc_again?viewmode=list ---------- Accagain 2014年5月15日 动态规划一 ...