1.集合ArrayList(List)
- F12轉(zhuǎn)到定義
-
ArrayList集合
1.數(shù)組的瓶頸:長度不可變、類型單一
集合的優(yōu)勢:長度可以任意改變、類型隨便
圖1:根據(jù)里氏轉(zhuǎn)換,這里放入任何對(duì)象都可以,因?yàn)閛bject是所有類的基類
圖2:ArrayList集合使用(ArrayList沒有l(wèi)ength變量,有count跟length效果一樣)
圖3:在上圖的基礎(chǔ)上加入了新的集合元素(5000m是指decimal類型)
圖4:打印出來的結(jié)果是這些新元素的命名空間 -
將一個(gè)對(duì)象輸出到控制臺(tái),默認(rèn)情況下,打印的是這個(gè)對(duì)象所在的類的命名空間。
圖5:執(zhí)行結(jié)果打印的是這個(gè)對(duì)象所在的類的命名空間
圖6:List[i]是Object的子類,所以才可以如此轉(zhuǎn)換
圖7:解決圖4的問題
圖8:ArrayList這里還不正常 - 綜上所述,想引入數(shù)組、對(duì)象和ArrayList本身就很麻煩。這里還有對(duì)象.AddRange();方法
對(duì)象.AddRange()和對(duì)象.Clear()方法
ArrayList的各種方法
對(duì)象.Clear();清空所有元素;
對(duì)象.Remove();清空單個(gè)元素,想刪誰()里放誰;
對(duì)象.RemoveAt();根據(jù)索引刪除,想刪誰()里放誰的索引;
對(duì)象.RemoveRange(a,b);刪除一定范圍內(nèi)的值,a填索引,表示從哪個(gè)位置開始刪除;b填刪除幾個(gè);
對(duì)象.Reverse();把整個(gè)ArrayList進(jìn)行反轉(zhuǎn);
對(duì)象.Sort();升序排列,bool和string等無法排序;
對(duì)象.Insert(a,b);在指定索引處插入一個(gè)值,其中a填指定索引處,b填要插入的值;(插入的值是任意類型的)
對(duì)象.InsertRange(a,b);在指定索引處插入一個(gè)集合,其中a填指定索引處,b填要插入的集合(如數(shù)組);
對(duì)象.Contains();()里面填寫要驗(yàn)證是否存在的值,此函數(shù)返回一個(gè)bool類型的變量;

ArrayList的長度
- count:表示這個(gè)集合中實(shí)際包含的元素個(gè)數(shù);
- capacity:表示這個(gè)集合中可以包含的元素的個(gè)數(shù);
count=0時(shí),capacity=0;
count=4時(shí),capacity=4;
count=5時(shí),capacity=8;//capacity是能容納count數(shù)的2的最小次方;
2.練習(xí)
-
練習(xí)1:創(chuàng)建一個(gè)集合,里面添加一些數(shù)字,求平均值與和;
這里還是里氏轉(zhuǎn)換,list雖然是object類的,但是里面放的是int類型的數(shù)據(jù),因此可以強(qiáng)制轉(zhuǎn)換為int類型的 -
練習(xí)2:寫一個(gè)長度為10的集合,要求里面隨機(jī)的添加10個(gè)數(shù)字(0-9),但是要求所有數(shù)字不重復(fù);
1.不能寫i<list.Count;因?yàn)槌跏糲ount為0;2.不要忘記寫else不然顯示的數(shù)字可能少于10個(gè)
3.Hashtable鍵值對(duì)集合(字典)
- 鍵值對(duì)集合里面填入的數(shù)據(jù)類型都是string類型的;
- 在鍵值對(duì)集合中,是根據(jù)鍵去找值的;鍵必須是唯一的,值可以是重復(fù)的;
-
鍵值對(duì)對(duì)象[鍵]=值;
在鍵值對(duì)集合中,不能用for循環(huán)來輸出每一個(gè)元素,如上所示,false這一項(xiàng)就遍歷不到
ht.Add(6,"哈哈哈");
ht[6]="哈哈哈";//兩種添加數(shù)據(jù)的方式,這種不會(huì)沖突,相當(dāng)于重新賦值
- 遍歷Hashtable方法foreach循環(huán)
for+兩下tab鍵,整體的框架都出來了
foreach(var item in collection) //foreach(var item in ht.Keys)
{ //Console.WriteLine(item,ht[item]);
}
//item 表示集合里面的每一項(xiàng)
//collection表示集合
c#是一門強(qiáng)類型語言:在代碼當(dāng)中,必須對(duì)每一個(gè)變量的類型有一個(gè)明確的定義
js是一門弱類型語言:任何類型都可以使用var定義,不考慮是什么類型
-
var
1.c#里面的var與js里面的不同,c#里面的var會(huì)根據(jù)值推斷類型,也就是說最終拿到的值是有明確類型的,如int、float、char等
2.在使用var關(guān)鍵字進(jìn)行聲明的時(shí)候必須賦初值,否則報(bào)錯(cuò)(因?yàn)関ar無法推斷類型)(因?yàn)楹芏嘀涤捎脩糨斎耄荒苌蟻砭蛯懰酪虼藇ar不常用) - 循環(huán)數(shù)量很大時(shí),foreach循環(huán)的效率大大高于for循環(huán)(循環(huán)數(shù)量不大時(shí)差別不大)
4.Hashtable鍵值對(duì)函數(shù)
鍵值對(duì)對(duì)象.Contains()返回bool類型的變量,查看是否包含鍵;
鍵值對(duì)對(duì)象.ContainsKey()與Contains作用相同;
鍵值對(duì)對(duì)象.ContainsValue()返回bool類型的變量,查看是否包含值;
鍵值對(duì)對(duì)象.Clear()移除所有集合中所有元素;
鍵值對(duì)對(duì)象.Remove() 根據(jù)鍵去移除;
5.練習(xí):繁簡轉(zhuǎn)換
namespace foreach循環(huán)
{
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("請(qǐng)輸入一段數(shù)字:");
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.學(xué)習(xí)三個(gè)高級(jí)參數(shù)out、ref 、params
- out用法
使用情景:返回多個(gè)相同類型的值可以使用數(shù)組,但是如果要返回多個(gè)不同類型的值需要用out參數(shù)(out參數(shù)也可以返回多個(gè)相同類型的值)。
步驟:
1)在參數(shù)列表里聲明變量時(shí)每一個(gè)前面都加一個(gè)out,out表示這個(gè)參數(shù)是我要多余返回的值。
2)帶out的參數(shù)要求在方法的內(nèi)部必須為其賦值圖1
3)調(diào)用帶out參數(shù)的方法時(shí),要提前聲明需要out 的變量(如下圖所示的min,max,avg等,必須聲明但可以不賦值,因?yàn)榈?步會(huì)給賦值),并在多余返回的值前面加out
圖2:計(jì)算最大值、最小值、均值、總和 - ref用法
如圖所示,main函數(shù)執(zhí)行完輸出的salary為5000,Main函數(shù)雖然調(diào)用了jiangjin函數(shù),但是jiangjin函數(shù)沒有返回值。圖3:計(jì)算工資
使用情景:如圖3所示,如果想得到5500這個(gè)答案,(需要聲明一個(gè)值用來接收jiangjin函數(shù)的返回值,jiangjin函數(shù)的void要變成int且需要return)或者使用ref。ref參數(shù)能夠?qū)⒁粋€(gè)變量帶入一個(gè)方法種改變,并將改變后的結(jié)果帶出參數(shù)。
步驟:
1)在jiangjin函數(shù)參數(shù)列表中加ref(double s變成ref double s)
2)調(diào)用jiangjin函數(shù)時(shí)傳入的參數(shù)加上ref【jiangjin(salary)變成jiangjin(ref salary)】
注意:out方法必須在方法內(nèi)賦值(因?yàn)閛ut是多余返回的值),ref方法需要在方法外方法執(zhí)行前賦值(因?yàn)閞ef是帶進(jìn)又帶出)。 - params可變參數(shù)用法
圖4:計(jì)算各科總分
使用情景: 這里出現(xiàn)的問題,一個(gè)是數(shù)組s內(nèi)的變量可能會(huì)增加(考試科目變多),一個(gè)是聲明變量越少越好(省空間)params的作用是將實(shí)參列表中跟可變參數(shù)數(shù)組類型一致的元素都當(dāng)作數(shù)組的元素去處理。
步驟:
圖5:使用params把單個(gè)變量處理成數(shù)組
注意:params參數(shù)數(shù)組必須是形參列表的最后一項(xiàng)。
n1=n1-n2;
n2=n1+n2;
n2=n2-n1;//不用臨時(shí)變量交換兩個(gè)數(shù)的值
7. double.TryParse用法
相同:double.TryParse方法和double.Parse方法都可以將字符串string轉(zhuǎn)換為double類型
不同:最重要的區(qū)別在于double.TryParse方法在字符串無法轉(zhuǎn)換為double類型的情況下不會(huì)引發(fā)程序異常,而double.Parse方法則是直接拋出程序異常。
double.TryParse方法在無法轉(zhuǎn)換的情況下返回false,并且使用了out參數(shù)進(jìn)行轉(zhuǎn)換。
double.TryParse方法的簽名為:static bool TryParse(string s, out Double result)這個(gè)的返回值是布爾類型,多余返回一個(gè)轉(zhuǎn)化完的double類型的結(jié)果。
double.Parse方法的簽名為:static Double Parse(string s)這個(gè)返回值類型是轉(zhuǎn)化后的結(jié)果,即double類型。
使用double.TryParse方法進(jìn)行類型轉(zhuǎn)換的時(shí)候,double變量無需先行賦值(但要聲明),在調(diào)用double.TryParse方法后,將自動(dòng)帶出結(jié)果值。
string轉(zhuǎn)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;
}
















