一、集合

使用时必须添加 System.Collections

集合与数组的区别:

1:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。初始化时集合无需定义多少个。
2:一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。即,集合是一组可变数量的元素的组合,这些元素可能共享某些特征,需要某种方式一起操作。一般来说,这些元素的类型是相同的。
3:数组是一种可读/可写数据结构没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方 只读方式来使用集合。该方法将返回一个集合的只读版本。数组是连续的、同一类型的数据的一块区域,而集合是不连续的、多种数据类型的。
二、集合的分类

1.栈:Stack,先进后出,一个一个赋值,一个一个取值,按顺序。

.count           取集合内元素的个数

.push()         将元素一个一个推入集合中//stack集合存入用.push()

.pop()           将元素一个个弹出集合

.clear()         清空集合

.clone()       复制

eg1、弹出移除数据

eg2、弹出不移除数据

string tanchu = ss.Peek().ToString();//只获取最后进去的那个数据值,不移除

 Stack s = new Stack();//先存入的后取出
s.Push();
s.Push();
s.Push(); Console.WriteLine(s.Pop()); //
Console.WriteLine(s.Pop());//

2.queue:先进先出,一个一个的赋值一个一个的取值,按照顺序。

.count              取集合内元素的个数

.Enqueue()            进队列集合//存入元素

.Dequeue()            出队列集合

.clear                清空集合

 Queue q = new Queue();
q.Enqueue();
q.Enqueue();
q.Enqueue(); Console.WriteLine(q.Dequeue());//
Console.WriteLine(q.Dequeue());//
Console.WriteLine(q.Dequeue());//

3.hashtable:先进后出,一个一个赋值,但只能一起取值。

用于处理和表现类似key value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的key value键值对.

.Add(,)              添加key和元素//用于元素添加

.Remove()        将括号内的元素移除

.contains()       判断集合中是否有括号内的元素

.count               计算集合中元素的个数

 Hashtable hshTable = new Hashtable(); //  创建哈希表
hshTable .Add("Person1", "zhanghf"); // 往哈希表里添加键值对
hshTable .Clear(); //移除哈希表里所有的键值对
hshTable .Contains("Person1"); //判断哈希表里是否包含该键
string name = (string)hshTable["Person1"].ToString(); //取哈希表里指定键的值
hshTable.Remove("Person1"); // 删除哈希表里指定键的键值对
IDictionaryEnumerator en = hshTable.GetEnumerator(); // 遍历哈希表所有的键,读出相应的值
while (en.MoveNext())
{
string str = en.Value.ToString();
}

目前下面的例子部分还看不懂

 class Program
    {
        static void Main(string[] args)
        {
            // 创建一个Hashtable实例
            Hashtable ht=new Hashtable();
 
            // 添加keyvalue键值对
            ht.Add("A","");
            ht.Add("B","");
            ht.Add("C","");
            ht.Add("D","");
 
            // 遍历哈希表
            foreach (DictionaryEntry de in ht)
            {
                Console.WriteLine("Key -- {0}; Value --{1}.", de.Key, de.Value);
            }
 
            // 哈希表排序
            ArrayList akeys=new ArrayList(ht.Keys);
            akeys.Sort();
            foreach (string skey in akeys)
            {
                Console.WriteLine("{0, -15} {1, -15}", skey, ht[skey]);
 
            }
 
            // 判断哈希表是否包含特定键,其返回值为true或false
            if (ht.Contains("A"))
              Console.WriteLine(ht["A"]);
             
            // 给对应的键赋值
            ht["A"] ="你好";
 
            // 移除一个keyvalue键值对
            ht.Remove("C");
 
            // 遍历哈希表
            foreach (DictionaryEntry de in ht)
            {
                Console.WriteLine("Key -- {0}; Value --{1}.", de.Key, de.Value);
            }
        
            // 移除所有元素
            ht.Clear();
   
            // 此处将不会有任何输出
            Console.WriteLine(ht["A"]);
            Console.ReadKey();
        }
    }
三、结构体

1、结构体定义:相当于是我们自己定义的一种复杂的类型(可以说是一个小型的类),它可以包含int...  double float bool char string  DateTime  数组类型。生活中大部份的对象都是复合型的对象。为了面对这些复合型的对象,必须要定义一个相应的结构来满足对象的需求。

a、如何定义结构体类型?

一般来说结构体的定义要放在class的外面或class的里面,尽量不放在Main的里面。

struct 自定义类型名

{

public 变量类型  变量名;

protected 变量类型  变量名;

privated   变量类型  变量名;

......;

......;


}

例如:

struct Student  //自定义的数据类型。用来描述学生的信息。

{

public string XueHao;

public string Name;

public int Age;

public double Score;

public bool Sex; (判断的时候用 条件运算符(三目)来判断)

}

b、如何用自定义的类型来定义变量?

自定义类型名 变量 = new 自定义类型名();

c、如何使用自定义类型的变量?

变量.子变量 = "xxxx"; Console.WriteLine(变量名.子变量);

eg:

//定义自定义类型的变量

Student zhangsan = new Student();

//给变量赋值

zhangsan.XueHao = "Y001";

zhangsan.Name = "张三";

zhangsan.Age = 22;

zhangsan.Sex = true;

zhangsan.Score = 100;

//对变量取值

Console.WriteLine(zhangsan.XueHao+"\t"+zhangsan.Name+"\t"+zhangsan.Age+"\t"+zhangsan.Score+"\t"+(zhangsan.Sex?"男":"女");

2、例子

a、双人对战游戏

  class Program
{
struct Player
{
public string name;
public int blood;
public int attack;
public int defence;
public int shanbi;
public ArrayList jineng ;
public ArrayList shanghai;
} static void Main(string[] args)
{ #region 定义技能库
string [] jn = new string[]{
"横扫千军",
"叽叽歪歪",
"龙腾",
"降龙十八掌",
"大鹏展翅",
"一阳指",
"六脉神剑",
"死亡一指",
"恩赐解脱",
"破釜沉舟",
};
int [] sh = new int[]{
,
,
,
,
,
,
,
,
, }; #endregion Console.WriteLine("请输入第一个玩家的姓名:");
string name1 = Console.ReadLine(); Console.WriteLine("请输入第二个玩家的姓名:");
string name2 = Console.ReadLine(); #region 造玩家,赋初始值 Player p1 = new Player();
int seed1=;
if (name1.Length == )
{
seed1 = (int)Convert.ToChar(name1.Substring(, )) + (int)Convert.ToChar(name1.Substring(, ));
}
else
{
seed1 = (int)Convert.ToChar(name1.Substring(, )) + (int)Convert.ToChar(name1.Substring(, )) + (int)Convert.ToChar(name1.Substring(, ));
}
Random r1 = new Random(seed1);
p1.name = name1;
p1.blood = +r1.Next();
p1.attack = + r1.Next();
p1.defence = + r1.Next();
p1.shanbi = +r1.Next();
p1.jineng = new ArrayList();
p1.shanghai = new ArrayList();
Random rj = new Random();
for(int i=;i<;i++)
{
int jnh = rj.Next();
string jnm = jn[jnh];
if (!p1.jineng.Contains(jnm))
{
p1.jineng.Add(jnm);
p1.shanghai.Add(sh[jnh]);
}
else
{
i--;
}
} Player p2 = new Player();
int seed2 = ;
if (name2.Length == )
{
seed2 = (int)Convert.ToChar(name2.Substring(, )) + (int)Convert.ToChar(name2.Substring(, ));
}
else
{
seed2 = (int)Convert.ToChar(name2.Substring(, )) + (int)Convert.ToChar(name2.Substring(, )) + (int)Convert.ToChar(name2.Substring(, ));
}
Random r2 = new Random(seed2);
p2.name = name2;
p2.blood = + r2.Next();
p2.attack = + r2.Next();
p2.defence = + r2.Next();
p2.shanbi = + r2.Next();
p2.jineng = new ArrayList();
p2.shanghai = new ArrayList(); for (int i = ; i < ; i++)
{
int jnh = rj.Next();
string jnm = jn[jnh];
if (!p2.jineng.Contains(jnm))
{
p2.jineng.Add(jnm);
p2.shanghai.Add(sh[jnh]);
}
else
{
i--;
}
} #endregion #region 显示玩家基础信息
Console.WriteLine("玩家1:姓名:{0},血量{1},攻击力{2},防御{3},闪避{4},所会技能1:{5},所会技能2:{6},所会技能3:{7}",p1.name,p1.blood,p1.attack,p1.defence,p1.shanbi,p1.jineng[],p1.jineng[],p1.jineng[]);
Console.WriteLine("玩家2:姓名:{0},血量{1},攻击力{2},防御{3},闪避{4},所会技能1:{5},所会技能2:{6},所会技能3:{7}", p2.name, p2.blood, p2.attack, p2.defence, p2.shanbi, p2.jineng[], p2.jineng[], p2.jineng[]);
#endregion Console.WriteLine("--------------------------------------------"); Console.WriteLine("请按空格键开始对战");
ConsoleKeyInfo key = Console.ReadKey();
Console.Clear();
if (key.Key.ToString().ToLower() == "spacebar")
{
#region 对战 while (true)
{
//判断退出条件
if (p1.blood == && p2.blood == )
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("同归于尽了!");
break;
}
else if (p1.blood == )
{
Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine(p2.name + "将" + p1.name + "KO了。。。");
break;
}
else if (p2.blood == )
{
Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine(p1.name + "将" + p2.name + "KO了。。。");
break;
} //开始打
#region p1打p2
//p1对p2进行殴打
Random rdz = new Random();
int dz1 = rdz.Next();
if (dz1 > ) //使用大招
{
int dzs = rdz.Next();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(p1.name + "使用了" + p1.jineng[dzs] + ",对" + p2.name + "造成了" + p1.shanghai[dzs] + "伤害!");
p2.blood = p2.blood - Convert.ToInt32(p1.shanghai[dzs]);
if (p2.blood <= )
{
p2.blood = ;
}
}
else //普通攻击
{
int ptgjsb = rdz.Next();
if (ptgjsb < p2.shanbi) //p2闪避
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(p2.name + "躲避了" + p1.name + "的这次攻击!");
}
else //未闪避
{
int p2sh = (p1.attack + rdz.Next()) - (p2.defence + rdz.Next());
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(p1.name + "对" + p2.name + "进行了普通攻击,造成了" + p2sh + "伤害!");
p2.blood = p2.blood - p2sh;
if (p2.blood <= )
{
p2.blood = ;
}
} }
#endregion
#region P2打P1
//p1对p2进行殴打
int dz2 = rdz.Next();
if (dz2 > ) //使用大招
{
int dzs = rdz.Next();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(p2.name + "使用了" + p2.jineng[dzs] + ",对" + p1.name + "造成了" + p2.shanghai[dzs] + "伤害!");
p1.blood = p1.blood - Convert.ToInt32(p2.shanghai[dzs]);
if (p1.blood <= )
{
p1.blood = ;
}
}
else //普通攻击
{
int ptgjsb = rdz.Next();
if (ptgjsb < p1.shanbi) //p2闪避
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(p1.name + "躲避了" + p2.name + "的这次攻击!");
}
else //未闪避
{
int p1sh = (p2.attack + rdz.Next()) - (p1.defence + rdz.Next());
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(p2.name + "对" + p1.name + "进行了普通攻击,造成了" + p1sh + "伤害!");
p1.blood = p1.blood - p1sh;
if (p1.blood <= )
{
p1.blood = ;
}
} }
#endregion Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine(p1.name + "的剩余血量为:" + p1.blood + ", " + p2.name + "的剩余血量为:" + p2.blood); Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("-----------------------------------------");
Console.WriteLine();
Thread.Sleep(); } #endregion }
}
}

b、输出学生成绩,并按总成绩排序

  //输出学生成绩,用泛型集合 添加student 结构体类型的集合,比较好用。如果用arraylist 则得用多个集合凑起来,同时完成!
static void Main11444(string[] args)
{
List<student> a = new List<student>();//相当于表格的列(个数),每个学生的内容 相当于列
Console.WriteLine("请输入总人数:");
int b = int.Parse(Console.ReadLine());
//student[] r = new student[b];//也可以这么定义 for (int i = ; i < b; i++)
{
student s = new student();
Console.WriteLine("请输入第{0}个学员的姓名:", i + );
//a[i].name = Console.ReadLine();
s.name = Console.ReadLine(); Console.WriteLine("请输入第{0}个学员的年龄:", i + );
s.age = int.Parse(Console.ReadLine()); Console.WriteLine("请输入第{0}个学员的性别:", i + );
s.sex = Console.ReadLine(); Console.WriteLine("请输入第{0}个学员的Csharp成绩:", i + );
s.Csharp = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入第{0}个学员的数据库成绩:", i + );
s.database = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入第{0}个学员的网页成绩:", i + );
s.web = Convert.ToDouble(Console.ReadLine()); //Console.WriteLine("请输入第{}个学员的姓名:", i + 1);
s.sum = s.web + s.Csharp + s.database; a.Add(s);
} for (int i = ; i < a.Count - ; i++)
{
for (int j = ; j < a.Count - - i; j++)
{
if (a[j].sum < a[j + ].sum)
{
student s = new student();
s = a[j];
a[j] = a[j + ];
a[j + ] = s;
}
}
} Console.WriteLine("姓名\t年龄\t性别\tCsharp成绩\t数据库成绩\t网页成绩\t总成绩"); foreach (student o in a)
{
Console.WriteLine(o.name + "\t" + o.age + "\t" + o.sex + "\t" + o.Csharp + "\t" + o.database + "\t" + o.web + "\t" + o.sum);
}
}
												

c# 课堂总结6 --集合与结构体的更多相关文章

  1. 【2017-03-02】C#集合,结构体,枚举

    集合 集合与数组的区别 数组:同一类型,固定长度 集合:不同类型,不固定长度 使用集合前需要:     引用命名空间:using System.Collections; 1.普通集合 定义: Arra ...

  2. c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)

    1.输入班级人数,统计每个人的姓名,性别,年龄:集合与数组 //Console.Write("请输入班级人数:"); //int a = int.Parse(Console.Rea ...

  3. C# 结构体集合元素属性不可修改疑惑

    背景:用C#的人都知道结构体在C#中是值类型的,由于这个原因出现了一个有趣的问题,那就是结构体集合通过数字索引修改对应属性的值能不能影响到集合中的结构体呢?答案很多人可能会说不能,因为结构体是值类型的 ...

  4. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  5. Go 语言结构体

    Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图书馆的书籍记录,每 ...

  6. go语言的结构体指针

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.   结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.   结构体表示一项记录,比 ...

  7. Go语言【第十一篇】:Go数据结构之:结构体

    Go语言结构体 Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型,结构体是由一系列具有相同类型或不同类型数据构成的集合.结构体表示一项记录,比如:保存图书馆的书籍记 ...

  8. 【Go】语法基础之结构体

    结构体的定义很简单: type Vertex struct { X, Y float64 } 可以理解为多个变量的集合. 结构体的使用: 1.直接使用: v := Vertex{1, 2} 或 var ...

  9. GO语言学习(十六)Go 语言结构体

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

随机推荐

  1. No.2小白的HTML+CSS心得篇

    今天要强调的重点是分析把握好HTML标签的两个方面: 1.标签的用途(用途指的是用来干什么,有什么作用)在专业术语叫作 语义化. 举个列子:<br/> 换行的作用 见了它就明白它的语义就是 ...

  2. What day is that day?(快速幂,打表找周期,或者求通项公式)

    有些题怎么都解不出来,这时候可以打表,找规律,求通项公式等,这些方法让人拍手叫绝,真不错…… Description It's Saturday today, what day is it after ...

  3. G - RPG的错排(错排)

    Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿 ...

  4. oracle 集合变量以及自定义异常的用法

    oracle 集合变量以及自定义异常的用法, 在过程 record_practice 有record变量和自定义异常的用法实例.具体在3284行. CREATE OR REPLACE Package ...

  5. 两台linux机器时间同步

    Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间. 配 ...

  6. (IOS)Apple 证书相关

    1.私钥 本地钥匙串程序创建<证书请求文件>(.certSigningRequest),用其向苹果申请下载<证书文件>/<私钥>(.cer),并安装到钥匙串: 团队 ...

  7. VJGUI消息设计-兼谈MFC、QT和信号/槽机制

    星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...

  8. linux中grep的用法

    http://www.9usb.net/200902/linux-grep.html http://blog.51yip.com/linux/1008.html http://blog.csdn.ne ...

  9. poj 1035 Spell checker(hash)

    题目链接:http://poj.org/problem?id=1035 思路分析: 1.使用哈希表存储字典 2.对待查找的word在字典中查找,查找成功输出查找成功信息 3.若查找不成功,对word增 ...

  10. android 项目中使用到的网络请求框架以及怎样配置好接口URL

    我们在做项目中一定少不了网络请求,如今非常多公司的网络请求这块好多都是使用一些比較好的开源框架,我项目中使用的是volley,如今讲讲一些volley主要的使用,假设想要具体的了解就要去看它的源代码了 ...