• c# 课堂总结6 --集合与结构体


    一、集合

    使用时必须添加 System.Collections

    集合与数组的区别:

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

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

    .count           取集合内元素的个数

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

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

    .clear()         清空集合

    .clone()       复制

    eg1、弹出移除数据

      

    eg2、弹出不移除数据

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

    1 Stack s = new Stack();//先存入的后取出
    2             s.Push(1);
    3             s.Push(2);
    4             s.Push(3);
    5 
    6             Console.WriteLine(s.Pop()); //3
    7             Console.WriteLine(s.Pop());//2

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

      .count              取集合内元素的个数

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

    .Dequeue()            出队列集合

    .clear                清空集合

     

    1 Queue q = new Queue();
    2             q.Enqueue(1);
    3             q.Enqueue(2);
    4             q.Enqueue(3);
    5 
    6             Console.WriteLine(q.Dequeue());//1
    7             Console.WriteLine(q.Dequeue());//2
    8             Console.WriteLine(q.Dequeue());//3

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

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

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

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

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

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

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

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

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             // 创建一个Hashtable实例
     6             Hashtable ht=new Hashtable(); 
     7  
     8             // 添加keyvalue键值对
     9             ht.Add("A","1");
    10             ht.Add("B","2");
    11             ht.Add("C","3");
    12             ht.Add("D","4");
    13  
    14             // 遍历哈希表
    15             foreach (DictionaryEntry de in ht)
    16             {
    17                 Console.WriteLine("Key -- {0}; Value --{1}.", de.Key, de.Value);
    18             }
    19  
    20             // 哈希表排序
    21             ArrayList akeys=new ArrayList(ht.Keys); 
    22             akeys.Sort();
    23             foreach (string skey in akeys) 
    24             {
    25                 Console.WriteLine("{0, -15} {1, -15}", skey, ht[skey]);
    26  
    27             }
    28  
    29             // 判断哈希表是否包含特定键,其返回值为true或false
    30             if (ht.Contains("A"))
    31               Console.WriteLine(ht["A"]);
    32              
    33             // 给对应的键赋值
    34             ht["A"] ="你好";
    35  
    36             // 移除一个keyvalue键值对
    37             ht.Remove("C");
    38  
    39             // 遍历哈希表
    40             foreach (DictionaryEntry de in ht)
    41             {
    42                 Console.WriteLine("Key -- {0}; Value --{1}.", de.Key, de.Value);
    43             }
    44         
    45             // 移除所有元素
    46             ht.Clear();
    47    
    48             // 此处将不会有任何输出
    49             Console.WriteLine(ht["A"]);
    50             Console.ReadKey();
    51         }
    52     }
    三、结构体

    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+" "+zhangsan.Name+" "+zhangsan.Age+" "+zhangsan.Score+" "+(zhangsan.Sex?"男":"女");  

     2、例子

    a、双人对战游戏

      1  class Program
      2     {
      3         struct Player
      4         {
      5             public string name;
      6             public int blood;
      7             public int attack;
      8             public int defence;
      9             public int shanbi;
     10             public ArrayList jineng ;
     11             public ArrayList shanghai;
     12         }
     13 
     14         static void Main(string[] args)
     15         {
     16 
     17             #region 定义技能库
     18             string [] jn = new string[10]{
     19                 "横扫千军",
     20                 "叽叽歪歪",
     21                 "龙腾",
     22                 "降龙十八掌",
     23                 "大鹏展翅",
     24                 "一阳指",
     25                 "六脉神剑",
     26                 "死亡一指",
     27                 "恩赐解脱",
     28                 "破釜沉舟",
     29             };
     30             int [] sh = new int[10]{
     31                 500,
     32                 300,
     33                 350,
     34                 500,
     35                 360,
     36                 400,
     37                 480,
     38                 490,
     39                 500,
     40                 450
     41             };
     42 
     43 
     44             #endregion
     45 
     46             Console.WriteLine("请输入第一个玩家的姓名:");
     47             string name1 = Console.ReadLine();
     48 
     49             Console.WriteLine("请输入第二个玩家的姓名:");
     50             string name2 = Console.ReadLine();
     51 
     52             #region 造玩家,赋初始值
     53 
     54             Player p1 = new Player();
     55             int seed1=0;
     56             if (name1.Length == 2)
     57             {
     58                 seed1 = (int)Convert.ToChar(name1.Substring(0, 1)) + (int)Convert.ToChar(name1.Substring(1, 1));
     59             }
     60             else
     61             {
     62                 seed1 = (int)Convert.ToChar(name1.Substring(0, 1)) + (int)Convert.ToChar(name1.Substring(1, 1)) + (int)Convert.ToChar(name1.Substring(2, 1));
     63             }
     64             Random r1 = new Random(seed1);
     65             p1.name = name1;
     66             p1.blood = 3000+r1.Next(1500);
     67             p1.attack = 200 + r1.Next(100);
     68             p1.defence = 80 + r1.Next(50);
     69             p1.shanbi = 2+r1.Next(2);
     70             p1.jineng = new ArrayList();
     71             p1.shanghai = new ArrayList();
     72             Random rj = new Random();
     73             for(int i=0;i<3;i++)
     74             {
     75                 int jnh = rj.Next(10);
     76                 string jnm = jn[jnh];
     77                 if (!p1.jineng.Contains(jnm))
     78                 {
     79                     p1.jineng.Add(jnm);
     80                     p1.shanghai.Add(sh[jnh]);
     81                 }
     82                 else
     83                 {
     84                     i--;
     85                 }
     86             }
     87 
     88             Player p2 = new Player();
     89             int seed2 = 0;
     90             if (name2.Length == 2)
     91             {
     92                 seed2 = (int)Convert.ToChar(name2.Substring(0, 1)) + (int)Convert.ToChar(name2.Substring(1, 1));
     93             }
     94             else
     95             {
     96                 seed2 = (int)Convert.ToChar(name2.Substring(0, 1)) + (int)Convert.ToChar(name2.Substring(1, 1)) + (int)Convert.ToChar(name2.Substring(2, 1));
     97             }
     98             Random r2 = new Random(seed2);
     99             p2.name = name2;
    100             p2.blood = 3000 + r2.Next(1500);
    101             p2.attack = 200 + r2.Next(100);
    102             p2.defence = 80 + r2.Next(50);
    103             p2.shanbi = 2 + r2.Next(2);
    104             p2.jineng = new ArrayList();
    105             p2.shanghai = new ArrayList();
    106            
    107             for (int i = 0; i < 3; i++)
    108             {
    109                 int jnh = rj.Next(10);
    110                 string jnm = jn[jnh];
    111                 if (!p2.jineng.Contains(jnm))
    112                 {
    113                     p2.jineng.Add(jnm);
    114                     p2.shanghai.Add(sh[jnh]);
    115                 }
    116                 else
    117                 {
    118                     i--;
    119                 }
    120             }
    121 
    122 
    123             #endregion
    124 
    125             #region 显示玩家基础信息
    126             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[0],p1.jineng[1],p1.jineng[2]);
    127             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[0], p2.jineng[1], p2.jineng[2]);
    128             #endregion
    129 
    130             Console.WriteLine("--------------------------------------------");
    131 
    132             Console.WriteLine("请按空格键开始对战");
    133             ConsoleKeyInfo key = Console.ReadKey();
    134             Console.Clear();
    135             if (key.Key.ToString().ToLower() == "spacebar")
    136             {
    137                 #region 对战
    138 
    139                 while (true)
    140                 {
    141                     //判断退出条件
    142                     if (p1.blood == 0 && p2.blood == 0)
    143                     {
    144                         Console.ForegroundColor = ConsoleColor.Yellow;
    145                         Console.WriteLine("同归于尽了!");
    146                         break;
    147                     }
    148                     else if (p1.blood == 0)
    149                     {
    150                         Console.ForegroundColor = ConsoleColor.Gray;
    151                         Console.WriteLine(p2.name + "" + p1.name + "KO了。。。");
    152                         break;
    153                     }
    154                     else if (p2.blood == 0)
    155                     {
    156                         Console.ForegroundColor = ConsoleColor.Gray;
    157                         Console.WriteLine(p1.name + "" + p2.name + "KO了。。。");
    158                         break;
    159                     }
    160 
    161                     //开始打
    162                     #region p1打p2
    163                     //p1对p2进行殴打
    164                     Random rdz = new Random();
    165                     int dz1 = rdz.Next(10);
    166                     if (dz1 > 7) //使用大招
    167                     {
    168                         int dzs = rdz.Next(3);
    169                         Console.ForegroundColor = ConsoleColor.White;
    170                         Console.WriteLine(p1.name + "使用了" + p1.jineng[dzs] + ",对" + p2.name + "造成了" + p1.shanghai[dzs] + "伤害!");
    171                         p2.blood = p2.blood - Convert.ToInt32(p1.shanghai[dzs]);
    172                         if (p2.blood <= 0)
    173                         {
    174                             p2.blood = 0;
    175                         }
    176                     }
    177                     else //普通攻击
    178                     {
    179                         int ptgjsb = rdz.Next(10);
    180                         if (ptgjsb < p2.shanbi) //p2闪避
    181                         {
    182                             Console.ForegroundColor = ConsoleColor.Green;
    183                             Console.WriteLine(p2.name + "躲避了" + p1.name + "的这次攻击!");
    184                         }
    185                         else //未闪避
    186                         {
    187                             int p2sh = (p1.attack + rdz.Next(50)) - (p2.defence + rdz.Next(20));
    188                             Console.ForegroundColor = ConsoleColor.Red;
    189                             Console.WriteLine(p1.name + "" + p2.name + "进行了普通攻击,造成了" + p2sh + "伤害!");
    190                             p2.blood = p2.blood - p2sh;
    191                             if (p2.blood <= 0)
    192                             {
    193                                 p2.blood = 0;
    194                             }
    195                         }
    196 
    197                     }
    198                     #endregion
    199                     #region P2打P1
    200                     //p1对p2进行殴打
    201                     int dz2 = rdz.Next(10);
    202                     if (dz2 > 7) //使用大招
    203                     {
    204                         int dzs = rdz.Next(3);
    205                         Console.ForegroundColor = ConsoleColor.White;
    206                         Console.WriteLine(p2.name + "使用了" + p2.jineng[dzs] + ",对" + p1.name + "造成了" + p2.shanghai[dzs] + "伤害!");
    207                         p1.blood = p1.blood - Convert.ToInt32(p2.shanghai[dzs]);
    208                         if (p1.blood <= 0)
    209                         {
    210                             p1.blood = 0;
    211                         }
    212                     }
    213                     else //普通攻击
    214                     {
    215                         int ptgjsb = rdz.Next(10);
    216                         if (ptgjsb < p1.shanbi) //p2闪避
    217                         {
    218                             Console.ForegroundColor = ConsoleColor.Green;
    219                             Console.WriteLine(p1.name + "躲避了" + p2.name + "的这次攻击!");
    220                         }
    221                         else //未闪避
    222                         {
    223                             int p1sh = (p2.attack + rdz.Next(50)) - (p1.defence + rdz.Next(20));
    224                             Console.ForegroundColor = ConsoleColor.Red;
    225                             Console.WriteLine(p2.name + "" + p1.name + "进行了普通攻击,造成了" + p1sh + "伤害!");
    226                             p1.blood = p1.blood - p1sh;
    227                             if (p1.blood <= 0)
    228                             {
    229                                 p1.blood = 0;
    230                             }
    231                         }
    232 
    233                     }
    234                     #endregion
    235 
    236                     Console.ForegroundColor = ConsoleColor.DarkYellow;
    237                     Console.WriteLine(p1.name + "的剩余血量为:" + p1.blood + ",  " + p2.name + "的剩余血量为:" + p2.blood);
    238 
    239                     Console.ForegroundColor = ConsoleColor.White;
    240                     Console.WriteLine("-----------------------------------------");
    241                     Console.WriteLine();
    242                     Thread.Sleep(2000);
    243 
    244 
    245 
    246                 }
    247 
    248                 #endregion
    249 
    250             }
    251         }
    252     }
    View Code

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

     1  //输出学生成绩,用泛型集合 添加student 结构体类型的集合,比较好用。如果用arraylist 则得用多个集合凑起来,同时完成!
     2         static void Main11444(string[] args)
     3         {
     4             List<student> a = new List<student>();//相当于表格的列(个数),每个学生的内容 相当于列
     5             Console.WriteLine("请输入总人数:");
     6             int b = int.Parse(Console.ReadLine());
     7             //student[] r = new student[b];//也可以这么定义
     8 
     9             for (int i = 0; i < b; i++)
    10             {
    11                 student s = new student();
    12                 Console.WriteLine("请输入第{0}个学员的姓名:", i + 1);
    13                 //a[i].name = Console.ReadLine();
    14                 s.name = Console.ReadLine();
    15 
    16                 Console.WriteLine("请输入第{0}个学员的年龄:", i + 1);
    17                 s.age = int.Parse(Console.ReadLine());
    18 
    19                 Console.WriteLine("请输入第{0}个学员的性别:", i + 1);
    20                 s.sex = Console.ReadLine();
    21 
    22                 Console.WriteLine("请输入第{0}个学员的Csharp成绩:", i + 1);
    23                 s.Csharp = Convert.ToDouble(Console.ReadLine());
    24 
    25                 Console.WriteLine("请输入第{0}个学员的数据库成绩:", i + 1);
    26                 s.database = Convert.ToDouble(Console.ReadLine());
    27 
    28                 Console.WriteLine("请输入第{0}个学员的网页成绩:", i + 1);
    29                 s.web = Convert.ToDouble(Console.ReadLine());
    30 
    31                 //Console.WriteLine("请输入第{}个学员的姓名:", i + 1);
    32                 s.sum = s.web + s.Csharp + s.database;
    33 
    34                 a.Add(s);
    35             }
    36 
    37             for (int i = 0; i < a.Count - 1; i++)
    38             {
    39                 for (int j = 0; j < a.Count - 1 - i; j++)
    40                 {
    41                     if (a[j].sum < a[j + 1].sum)
    42                     {
    43                         student s = new student();
    44                         s = a[j];
    45                         a[j] = a[j + 1];
    46                         a[j + 1] = s;
    47                     }
    48                 }
    49             }
    50 
    51             Console.WriteLine("姓名	年龄	性别	Csharp成绩	数据库成绩	网页成绩	总成绩");
    52 
    53             foreach (student o in a)
    54             {
    55                 Console.WriteLine(o.name + "	" + o.age + "	" + o.sex + "	" + o.Csharp + "	" + o.database + "	" + o.web + "	" + o.sum);
    56             }
    57         }
    View Code


  • 相关阅读:
    图灵5月书讯※特别制作【MongoDB将在5月中旬隆重上市】
    让你学会狂妄懂得谦卑的书
    一千个读者,一千个不同的编程人生
    松本行弘为什么开发Ruby
    在Flex控件中使用XMLListCollection
    32位系统部署到64位下常见问题及解决
    win7系统的IIS服务器如何解除上传200k限制
    Asp.net单点登录解决方案
    Web.Config加密【转】
    在IIS8添加WCF服务支持
  • 原文地址:https://www.cnblogs.com/zyh-club/p/4639561.html
Copyright © 2020-2023  润新知