C#学习笔记(十六):索引器和重载运算符


二维数组如何映射到一维数组



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace m1w4d2_indexes
{
#region 索引器-李索
//索引器可以让我们通过不同的索引号返回对应类型的多个属性
//索引器适用于除自动属性以外的所有属性特性
//索引号可以是任意类型
//索引器在通过类对象来访问和赋值 变量(类对象)[索引号]
//访问修饰 返回类型 this[索引号,索引号,索引号,索引号......]
//{ get {return} set {value} }
//用索引器访问一个怪物类中的不同字段
class Monster
{
public Monster(int attack, int defend, int health, int speed, string name)
{
this.attack = attack;
this.defend = defend;
this.health = health;
this.speed = speed;
this.name = name;
}
int attack;
int defend;
int health;
int speed;
string name;
//public string this[int indexa, int indexb]
//{
// get { return ""; }
// set { }
//}
public string this[int index]
{
get
{
string str = "";
switch (index)
{
case : str = attack.ToString(); break;
case : str = defend.ToString(); break;
case : str = health.ToString(); break;
case : str = speed.ToString(); break;
case : str = name; break;
}
return str;
}
set
{
switch (index)
{
case : attack = int.Parse(value); break;
case : defend = int.Parse(value); break;
case : health = int.Parse(value); break;
case : speed = int.Parse(value); break;
case : name = value; break;
}
}
}
}
#endregion
#region 多维度的索引号
//索引号可以任意维度
//用一个MyArray类去模拟一个二维数组
class MyArray
{
public MyArray(int x, int y)
{
//这个放元素的一维数组多长
//array = new int[10];
array = new int[x * y];//一维数组的长度
Length = new int[];
Length[] = x;
Length[] = y;
}
int[] Length;
int[] array;
public int GetLength(int index)
{
if (index > Length.Length)
{
throw new IndexOutOfRangeException();//抛异常
}
return Length[index];
}
public int this[int x, int y]
{
get
{
//我给你一个二维的下标,你如何映射到一维数组上
return array[x + y * GetLength()];
}
set
{
array[x + y * GetLength()] = value;
}
}
}
#endregion
#region 索引器-沈军
class Unity1803
{
// C# 单例模式 (单独的实例)
private static Unity1803 instance = null;
public static Unity1803 Instance
{
get
{
if (instance == null) instance = new Unity1803();
return instance;
}
}
//静态构造函数什么时候调用
//当我们访问静态成员的时候,先调用且只调用一次
//当我们创建对象的时候,先调用且只调用一次
//可以对静态字段做初始化使用的,静态的成员才会加载到内存中
//static Unity1803()//静态构造函数,不能有访问修饰符和参数
//{
// Console.WriteLine("调用静态构造函数");
//}
public int Count { private set; get; } //
Student[] students = new Student[]; // null
private Unity1803()
{
students[] = new Student("蔡浩", , );
Count++;
students[] = new Student("江灿荣", , );
Count++;
students[] = new Student("贺益民", , );
Count++;
}
public Student this[int index]
{
get
{
return students[index];
}
set
{
if (students[index] == null) Count++;
students[index] = value;
}
}
public Student this[string name]
{
get
{
for (int i = ; i < Count; i++)
{
if (students[i].Name == name)
{
return students[i];
}
}
return null;
}
set
{
students[Count] = new Student(name, , );
}
}
}
class Student
{
public string Name { get; set; }
public int Age { get; set; }
public int CSharpScore { get; set; }
public Student(string name, int age, int score)
{
this.Name = name;
this.Age = age;
this.CSharpScore = score;
}
public override string ToString()
{
return "Name:" + Name + ", Age :" + Age + ", Score :" + CSharpScore;
}
public static bool operator >(Student lfs, int score)
{
return lfs.CSharpScore > score;
}
public static bool operator <(Student lfs, int score)
{
return lfs.CSharpScore < score;
}
public static bool operator true(Student s)
{
return s.CSharpScore >= ;
}
public static bool operator false(Student s)
{
return s.CSharpScore < ;
}
// 隐式类型转换 把字符串隐式的转换成Student类型
public static implicit operator Student(string name)
{
Student s = new Student(name, , );
return s;
}
// 显式类型转换 把Student类型强转成字符串
public static explicit operator string(Student s)
{
return s.Name;
}
}
#endregion
class Program
{
static void Main(string[] args)
{
#region 索引器-李索
Monster monster = new Monster(, , , , "哥布林");
for (int i = ; i < ; i++)
{
Console.WriteLine(monster[i]);
}
Console.WriteLine();
//把一个策划文档的数据切割成对应的字符数组
//序列化
string dataTitle = "attack,defend,health,speed,name";
string data = "100,15,500,1,蠕虫皇后";
string[] datas = data.Split(',');
for (int i = ; i < ; i++)
{
monster[i] = datas[i];
}
for (int i = ; i < ; i++)
{
Console.WriteLine(monster[i]);
}
#endregion
#region 多维度的索引号
//索引号可以任意维度
//用一个MyArray类去模拟一个二维数组
MyArray myArray = new MyArray(, );
for (int x = ; x < myArray.GetLength(); x++)
{
for (int y = ; y < myArray.GetLength(); y++)
{
myArray[x, y] = x * + y;
}
}
for (int y = ; y < myArray.GetLength(); y++)
{
for (int x = ; x < myArray.GetLength(); x++)
{
Console.Write(myArray[x, y] + "\t");
}
Console.WriteLine();
}
#endregion
#region 索引器-沈军
// 属性 操作字段
// 索引器 对于操作集合的一种封装
//Unity1803 unity1803 = new Unity1803();
//unity1803[2] = new Student("沈天宇", 20, 95);
for (int i = ; i < Unity1803.Instance.Count; i++)
{
if (Unity1803.Instance[i])
{
Console.WriteLine(Unity1803.Instance[i]); // .ToString()方法
}
}
Unity1803.Instance[Unity1803.Instance.Count] = "丁超"; // 隐式类型转换
string name = (string)Unity1803.Instance[]; // 显式类型转换
//Console.WriteLine(unity1803["沈天宇"]);
//Unity1803 _unity1803 = new Unity1803();
//Console.WriteLine(Unity1803.Count);
//Unity1803.instance = new Unity1803(); // 只读的
//Unity1803 u1 = new Unity1803(); // 不允许的
//Console.WriteLine(Unity1803.Instance[0]);
// 隐式转换 显式转换
int num1 = ;
byte num2 = ;
num1 = num2; // 隐式类型转换
num2 = (byte)num1; // 显式类型转换
#endregion
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace m1w4d2_operator
{
#region 练习1
//通过重载运算符,我们可以给自定类型,增加计算功能
struct Point2D
{
public int x, y;
public Point2D(int x, int y)
{
this.x = x;
this.y = y;
}
public static Point2D Up = new Point2D(, -);
public static Point2D Down = new Point2D(, );
public static Point2D Left = new Point2D(-, );
public static Point2D Right = new Point2D(, );
//返回类型?,函数名(operator 运算符)?参数?
//public static i = i + 1;
//两个参数,任意类型
//返回类型,任意类型
//算数运算符 是双目运算符,参数必须是两个,任意类型,返回类型,任意类型
public static Point2D operator +(Point2D a, Point2D b)
{
return new Point2D(a.x + b.x, a.y + b.y);
}
public static Point2D operator -(Point2D a, Point2D b)
{
return new Point2D(a.x - b.x, a.y - b.y);
}
//关系运算符 是双目运算符,参数必须是两个,任意类型,返回类型是bool
public static bool operator ==(Point2D a, Point2D b)
{
return a.x == b.x && a.y == b.y;
}
public static bool operator !=(Point2D a, Point2D b)
{
return !(a == b);
}
public override string ToString()
{
return string.Format("[x:{0},y{1}]", x, y);
}
}
#endregion
#region 练习2
class Item
{
public static string style = "剑刀盾斧药";
public Item(string name, int value)
{
this.name = name;
this.value = value;
}
string name;
int value;
public override string ToString()
{
return string.Format("{0}:value:{1}", name, value);
}
}
class Monster
{
public static Random roll = new Random();
public int attack;
public string name;
public int speed;
public Monster(int attack, int speed, string name)
{
this.attack = attack;
this.name = name;
this.speed = speed;
}
public static Item operator +(Monster a, Monster b)
{
string name = a.name.Substring(a.name.Length / ) + b.name.Substring(b.name.Length / ) + Item.style[roll.Next(, Item.style.Length)];
int value = (a.attack + b.attack) * + a.speed + b.speed;
if (name[name.Length - ] == '屎')
{
value /= ;
}
return new Item(name, value);
}
public override string ToString()
{
return string.Format("{0}:attack:{1},speed:{2}", name, attack, speed);
}
}
#endregion
class Program
{
static void Main(string[] args)
{
#region 练习1
//老位置
Point2D oldPosition = new Point2D(, );
//position.x += dir.x;
//新位置 是老位置 向上走一步
Console.WriteLine(oldPosition);
Point2D newPosition = oldPosition + Point2D.Up;
Console.WriteLine(newPosition);
//请问,新位置在老位置的哪个方向
string dirStr = "";
Point2D pointDir = newPosition - oldPosition;
if (pointDir == Point2D.Up) dirStr = "上";
else if (pointDir == Point2D.Down) dirStr = "下";
else if (pointDir == Point2D.Left) dirStr = "左";
else if (pointDir == Point2D.Right) dirStr = "右";
Console.WriteLine("你的前进方向是{0}", dirStr);
#endregion
#region 练习2
Monster a = new Monster(, , "哥布林");
Monster b = new Monster(, , "索尼克");
Console.WriteLine(a);
Console.WriteLine(b);
Item item = a + b;
Console.WriteLine(item);
#endregion
}
}
}
C#学习笔记(十六):索引器和重载运算符的更多相关文章
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- MySQL学习笔记十六:锁机制
1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...
- Struts2学习笔记(十)——自定义拦截器
Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理.Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的:Struts2拦截器栈就 ...
- Java基础学习笔记十六 集合框架(二)
List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...
- 文件的上传Commons FileUpload(web基础学习笔记十六)
一.表单设置 <form action="<%=request.getContextPath()%>/jsp/admin/doAdd.jsp" enctype=& ...
- JavaScript权威设计--CSS(简要学习笔记十六)
1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...
- SharpGL学习笔记(十六) 多重纹理映射
多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...
随机推荐
- 解决VMware虚拟机的CentOS无法上网
1)点击 VM->Settings Hardware选项卡下面 2)点击Network Adapter 设置如下图所示,首先我们在虚拟机中将网络配置设置成NAT 在服务中开启: VMware D ...
- 【Pyton】【小甲鱼】魔法方法
1.__init__ >>> class Rectangle: def __init__(self,x,y): self.x=x self.y=y def getPeri(self) ...
- linux基础(2)-基础命令和基础特性
基础命令 命令历史 命令历史的管理 登陆 shell 时,会读取命令历史文件中记录下的命令: ~/.bash_history . 登陆进 shell 后,新执行的命令只会记录在缓存中,这些命令会在用户 ...
- [js]ext.js探索
Ext JS 经常会遇到布局等头疼的问题,一直在用bootstrap,但是我不喜欢这玩意出的效果想找个合适的js架构入手 http://examples.sencha.com/extjs/6.6.0/ ...
- PAT Counting Leaves[一般]
1004 Counting Leaves (30)(30 分) A family hierarchy is usually presented by a pedigree tree. Your job ...
- git 下载单个文件 已经添加多个远程服务器
175down vote It is possible to do (in the deployed repository) git fetch followed by git checkout or ...
- vscode 搭建react-native
vscode 搭建react-native 选择:vscode + typings + eslint * vscode: 宇宙最强IDE家族的最新产品 * typings: 基于typescirpt的 ...
- 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?
如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括:如何 ...
- mysql回滚日志
一.回滚日志(undo log) 1.作用 保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读 2.内容 逻辑格式的日志,在执行undo的时候 ...
- 27. Remove Element(双指针)
Given an array nums and a value val, remove all instances of that value in-place and return the ne ...