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扩展库中才提 ...
随机推荐
- 【剑指offer】替换空格
一.题目: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 二.思路: Python代码,先 ...
- python框架之Django(2)-简单的CRUD
写一个简单的项目小例子来了解Django中的O/RM操作 前戏 创建app #在Django项目根目录下执行 python3 manage.py startapp [app name] 配置数据库连接 ...
- visualSVN server安装使用
SVN服务推荐使用visualSVN server,安装完成之后自动设置开机启动服务,具体使用如下图:
- [LeetCode] 832. Flipping an Image_Easy
Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...
- 数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析
#include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初 ...
- 使用 MtVerify.h头文件 ,用的时候把他头文件的内容添加到项目
#include <windows.h> //windodws变量相关头文件 MtVerify.h的内容如下:#pragma comment( lib, "USER32&quo ...
- Liferay中request
在liferay中的请求分为renderRequest和actionRequest这两种请求的方式,portletRequest的子类有三个1renderRequest,2EventRequest3C ...
- js数组之迭代器方法
迭代器方法:对数组中的每一个元素应用一个函数,可以返回一个值,一组值或者一个新的数组.说的什么啊这是,根本听不懂.实践 不生成新数组的迭代器的方法: <html> <head> ...
- Linux其他:环境变量配置
计算机==>右键==>属性==>高级系统设置==>环境变量==> 系统变量path后面+';python路径名
- 论文笔记之《Event Extraction via Dynamic Multi-Pooling Convolutional Neural Network》
1. 文章内容概述 本人精读了事件抽取领域的经典论文<Event Extraction via Dynamic Multi-Pooling Convolutional Neural Networ ...