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

重载运算符
1、算术运算符
2、关系运算符, < 和 > 成对重载

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#学习笔记(十六):索引器和重载运算符的更多相关文章

  1. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  2. (C/C++学习笔记) 十六. 预处理

    十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...

  3. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  4. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  5. Struts2学习笔记(十)——自定义拦截器

    Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理.Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的:Struts2拦截器栈就 ...

  6. Java基础学习笔记十六 集合框架(二)

    List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...

  7. 文件的上传Commons FileUpload(web基础学习笔记十六)

    一.表单设置 <form action="<%=request.getContextPath()%>/jsp/admin/doAdd.jsp" enctype=& ...

  8. JavaScript权威设计--CSS(简要学习笔记十六)

    1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...

  9. SharpGL学习笔记(十六) 多重纹理映射

    多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...

随机推荐

  1. 【Echarts】图表用echarts【待完善】

    echarts是做数据统计. ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox ...

  2. 【小甲鱼】【Python】正则表达式(二)

    >>> import re#|表示或的意思 >>> re.search(r"Fish(C|D)","FishC") < ...

  3. Spring-事务管理(Transaction)

    1.事务介绍 事务(Transaction):访问并能更新数据库中数据项的一个程序执行单元. 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须要么全部完成,要么什么都不做,如果有 ...

  4. mysql 数据操作 多表查询 多表连接查询 全外连接

    全外连接:显示左右两个表全部记录 全外连接 在内连接的基础上保留左右两表没有对应关系的记录 full join #注意:mysql不支持全外连接 full JOIN mysql> select ...

  5. js 的each()方法遍历对象和数组

    <script src="../lib/jquery-1.8.3.min.js" ></script> <script type="text ...

  6. Ultra-QuickSort(poj 2299归并排序)

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=232#problem/A B - Ultra-QuickSort Time Li ...

  7. CMPXCHG指令

    一.CMPXCHG汇编指令详解. 这条指令将al\ax\eax\rax中的值与首操作数比较: 1.如果相等,第2操作数的直装载到首操作数,zf置1.(相当于相减为0,所以0标志位置位) 2.如果不等, ...

  8. linux中的查找命令

    which命令:使用which命令可以看到某个系统命令是否存在,以及执行的到底是哪一个位置上的命令.在PATH指定的路径中进行搜索, 返回第一个搜索结果. which grep /bin/grep   ...

  9. CHM无法正常显示的问题

    很喜欢看CHM电子书,感觉篇幅不是很长,而且可以索引:但是昨天遇到这个问题: 打开文件的时候发现: 很喜欢看CHM电子书,感觉篇幅不是很长,而且可以索引:但是昨天遇到这个问题: 打开文件的时候发现: ...

  10. Linux命令: 在线使用linux命令环境

    https://www.tutorialspoint.com/unix_terminal_online.php