美文网首页
c#面向对象4--集合ArrayList(List)/HashT

c#面向对象4--集合ArrayList(List)/HashT

作者: Mona_Song | 来源:发表于2021-03-29 11:52 被阅读0次

1.集合ArrayList(List)

  • F12转到定义
  • ArrayList集合
    1.数组的瓶颈:长度不可变、类型单一
    集合的优势:长度可以任意改变、类型随便


    图1:根据里氏转换,这里放入任何对象都可以,因为object是所有类的基类
    图2:ArrayList集合使用(ArrayList没有length变量,有count跟length效果一样)
    图3:在上图的基础上加入了新的集合元素(5000m是指decimal类型)
    图4:打印出来的结果是这些新元素的命名空间
  • 将一个对象输出到控制台,默认情况下,打印的是这个对象所在的类的命名空间。


    图5:执行结果打印的是这个对象所在的类的命名空间
    图6:List[i]是Object的子类,所以才可以如此转换
    图7:解决图4的问题
    图8:ArrayList这里还不正常
  • 综上所述,想引入数组、对象和ArrayList本身就很麻烦。这里还有对象.AddRange();方法
    对象.AddRange()和对象.Clear()方法

ArrayList的各种方法

对象.Clear();清空所有元素;
对象.Remove();清空单个元素,想删谁()里放谁;
对象.RemoveAt();根据索引删除,想删谁()里放谁的索引;
对象.RemoveRange(a,b);删除一定范围内的值,a填索引,表示从哪个位置开始删除;b填删除几个;
对象.Reverse();把整个ArrayList进行反转;
对象.Sort();升序排列,bool和string等无法排序;
对象.Insert(a,b);在指定索引处插入一个值,其中a填指定索引处,b填要插入的值;(插入的值是任意类型的)
对象.InsertRange(a,b);在指定索引处插入一个集合,其中a填指定索引处,b填要插入的集合(如数组);
对象.Contains();()里面填写要验证是否存在的值,此函数返回一个bool类型的变量;

这里第二次执行时依然不会有else的结果出现,因为ArrayList不存储数据,需要在if-else判断外面加一条List.Add();才会出现else的结果

ArrayList的长度

  • count:表示这个集合中实际包含的元素个数;
  • capacity:表示这个集合中可以包含的元素的个数;
    count=0时,capacity=0;
    count=4时,capacity=4;
    count=5时,capacity=8;//capacity是能容纳count数的2的最小次方;

2.练习

  • 练习1:创建一个集合,里面添加一些数字,求平均值与和;


    这里还是里氏转换,list虽然是object类的,但是里面放的是int类型的数据,因此可以强制转换为int类型的
  • 练习2:写一个长度为10的集合,要求里面随机的添加10个数字(0-9),但是要求所有数字不重复;


    1.不能写i<list.Count;因为初始count为0;2.不要忘记写else不然显示的数字可能少于10个

3.Hashtable键值对集合(字典)

  • 键值对集合里面填入的数据类型都是string类型的;
  • 在键值对集合中,是根据键去找值的;键必须是唯一的,值可以是重复的;
  • 键值对对象[键]=值;


    在键值对集合中,不能用for循环来输出每一个元素,如上所示,false这一项就遍历不到
ht.Add(6,"哈哈哈");
ht[6]="哈哈哈";//两种添加数据的方式,这种不会冲突,相当于重新赋值
  • 遍历Hashtable方法foreach循环

for+两下tab键,整体的框架都出来了

foreach(var item in collection)  //foreach(var item in ht.Keys)
{                                //Console.WriteLine(item,ht[item]);
}
//item 表示集合里面的每一项  
//collection表示集合

c#是一门强类型语言:在代码当中,必须对每一个变量的类型有一个明确的定义
js是一门弱类型语言:任何类型都可以使用var定义,不考虑是什么类型

  • var
    1.c#里面的var与js里面的不同,c#里面的var会根据值推断类型,也就是说最终拿到的值是有明确类型的,如int、float、char等
    2.在使用var关键字进行声明的时候必须赋初值,否则报错(因为var无法推断类型)(因为很多值由用户输入,不能上来就写死因此var不常用)
  • 循环数量很大时,foreach循环的效率大大高于for循环(循环数量不大时差别不大)

4.Hashtable键值对函数

键值对对象.Contains()返回bool类型的变量,查看是否包含键;
键值对对象.ContainsKey()与Contains作用相同;
键值对对象.ContainsValue()返回bool类型的变量,查看是否包含值;
键值对对象.Clear()移除所有集合中所有元素;
键值对对象.Remove() 根据键去移除;

5.练习:繁简转换

namespace foreach循环
{
    class Program
    {
        static void Main(string[] args)
        {
            string jian = "0123456789";
            string fan = "零一二三四五六七八九";
            Hashtable ht = new Hashtable();
            for (int i = 0; i < jian.Length; i++)
            {
                ht.Add(jian[i],fan[i]);
            }
            Console.WriteLine("请输入一段数字:");
            string input = Console.ReadLine();
            for(int i=0;i<input.Length;i++)
            {
                if (jian.Contains(input[i]))
                    Console.Write(ht[input[i]]);
                else
                    Console.Write(input[i]);
            }
            Console.ReadKey();
        }
    }
}
执行效果

6.学习三个高级参数out、ref 、params

  • out用法
    使用情景:返回多个相同类型的值可以使用数组,但是如果要返回多个不同类型的值需要用out参数(out参数也可以返回多个相同类型的值)。
    步骤
    1)在参数列表里声明变量时每一个前面都加一个out,out表示这个参数是我要多余返回的值。
    图1 2)带out的参数要求在方法的内部必须为其赋值
    3)调用带out参数的方法时,要提前声明需要out 的变量(如下图所示的min,max,avg等,必须声明但可以不赋值,因为第2步会给赋值),并在多余返回的值前面加out
    图2:计算最大值、最小值、均值、总和
  • ref用法
    图3:计算工资 如图所示,main函数执行完输出的salary为5000,Main函数虽然调用了jiangjin函数,但是jiangjin函数没有返回值。
    使用情景:如图3所示,如果想得到5500这个答案,(需要声明一个值用来接收jiangjin函数的返回值,jiangjin函数的void要变成int且需要return)或者使用ref。ref参数能够将一个变量带入一个方法种改变,并将改变后的结果带出参数。
    步骤
    1)在jiangjin函数参数列表中加ref(double s变成ref double s)
    2)调用jiangjin函数时传入的参数加上ref【jiangjin(salary)变成jiangjin(ref salary)】
    注意:out方法必须在方法内赋值(因为out是多余返回的值),ref方法需要在方法外方法执行前赋值(因为ref是带进又带出)。
  • params可变参数用法
    图4:计算各科总分
    使用情景: 这里出现的问题,一个是数组s内的变量可能会增加(考试科目变多),一个是声明变量越少越好(省空间)params的作用是将实参列表中跟可变参数数组类型一致的元素都当作数组的元素去处理。
    步骤
    图5:使用params把单个变量处理成数组
    注意:params参数数组必须是形参列表的最后一项。
n1=n1-n2;
n2=n1+n2;
n2=n2-n1;//不用临时变量交换两个数的值

7. double.TryParse用法

相同:double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型
不同:最重要的区别在于double.TryParse方法在字符串无法转换为double类型的情况下不会引发程序异常,而double.Parse方法则是直接抛出程序异常。
double.TryParse方法在无法转换的情况下返回false,并且使用了out参数进行转换。

double.TryParse方法的签名为:static bool TryParse(string s, out Double result)这个的返回值是布尔类型,多余返回一个转化完的double类型的结果。
double.Parse方法的签名为:static Double Parse(string s)这个返回值类型是转化后的结果,即double类型。

使用double.TryParse方法进行类型转换的时候,double变量无需先行赋值(但要声明),在调用double.TryParse方法后,将自动带出结果值。

string转double的三种方式

string numStr = "33.44";
 
          double numDouble1 = double.Parse(numStr);
          double numDouble2 =Convert.ToDouble(numStr);
          double numDouble3;
          if (!double.TryParse(numStr, out numDouble3))
          {
              numDouble3 = 0D;
          }

相关文章

网友评论

      本文标题:c#面向对象4--集合ArrayList(List)/HashT

      本文链接:https://www.haomeiwen.com/subject/alxshltx.html