版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C#中的數(shù)組用法詳解varsum=SumOfSegments(segments);
Console.WriteLine("sumofallsegments:{0}",sum);
staticintSumOfSegments(ArraySegmentint[]segments)
intsum=0;
foreach(varsegmentinsegments)
for(inti=segment.Offset;isegment.Offset+segment.Count;i++)
sum+=segment.Array[i];
returnsum;
}
數(shù)組段不復(fù)制原數(shù)組的元素,但原數(shù)組可以通過(guò)ArraySegmentT訪問(wèn)。如果數(shù)組段中的元素改變了,這些變化就會(huì)反映到原數(shù)組中。
六.枚舉集合
在foreach語(yǔ)句中使用枚舉,可以迭代集合中的元素,且無(wú)需知道集合中元素的個(gè)數(shù)。foreach語(yǔ)句使用一個(gè)枚舉器。foreach會(huì)調(diào)用實(shí)現(xiàn)了IEnumerable接口的集合類中的GetEumerator()方法。GetEumerator()方法返回一個(gè)實(shí)現(xiàn)IEnumerator接口的對(duì)象枚舉。foreach語(yǔ)句就可以使用IEnumerable接口迭代集合了。
GetEumerator()方法在IEnumerable接口中定義。
1.IEnumerator接口
foreach語(yǔ)句使用IEnumerator接口的方法和屬性,迭代集合中所有元素。IEnumerator接口定義了Current屬性,來(lái)返回光標(biāo)所在的元素,該接口的MoveNext()方法移動(dòng)到集合的下一個(gè)元素上,如果有這個(gè)元素,該方法就返回true。如果集合不再有更多的元素,該方法就返回false.
這個(gè)接口的泛型版本IEnumeratorT派生自接口IDisposable,因此定義了Dispose()方法,來(lái)清理枚舉器占用的資源。
2.foreach語(yǔ)句
C#中foreach語(yǔ)句不會(huì)解析為IL代碼中的foreach語(yǔ)句。C#編譯器會(huì)把foreach語(yǔ)句轉(zhuǎn)換為IEnumerator接口的方法和屬性。
Person[]persons={
newPerson{FirstName="Damon",LastName="Hill"},
newPerson{FirstName="Niki",LastName="Lauda"},
newPerson{FirstName="Ayrton",LastName="Senna"},
newPerson{FirstName="Graham",LastName="Hill"}
foreach(Personpinpersons)
Console.WriteLine(p);
}
foreach語(yǔ)句會(huì)解析為下面的代碼:
IEnumeratorPersonenumerator=persons.GetEumerator();
while(enumerator.MoveNext())
Personp=enumerator.Current;
Console.WriteLine(p);
}
3.yield語(yǔ)句
在C#2.0之前,foreach語(yǔ)句可以輕松的迭代集合,但創(chuàng)建枚舉器需要做大量的工作。C#2.0添加了yield語(yǔ)句,以便創(chuàng)建枚舉器。
yieldreturn語(yǔ)句返回集合的一個(gè)元素,并移動(dòng)到下一個(gè)元素。yieldbreak可停止迭代。
下面的例子實(shí)現(xiàn)返回兩個(gè)字符串:
publicclassHelloCollection
publicIEnumeratorstringGetEnumerator()
yieldreturn"Hello";
yieldreturn"World";
}
客戶端代碼:
varhelloCollection=newHelloCollection();
foreach(stringsinhelloCollection)
Console.WriteLine(s);
}
包含yield語(yǔ)句的方法或?qū)傩砸卜Q為迭代塊。迭代塊必須聲明為返回IEnumerator或IEnumerable接口,或者這些接口的泛型版本。這個(gè)塊可以包含多條yieldreturn語(yǔ)句或yieldbreak語(yǔ)句,但不能包含return語(yǔ)句。
使用迭代塊,編譯器會(huì)生成一個(gè)yield類型,其中包含一個(gè)狀態(tài)機(jī),如下面代碼所示:
yield類型實(shí)現(xiàn)IEnumerator和IDisposable接口的方法和屬性。下面的例子可以把yield類型看作內(nèi)部類Enumerator。外部類的GetEnumerator()方法實(shí)例化并返回一個(gè)新的yield類型。在yield類型中,變量state定義了迭代的當(dāng)前位置,每次調(diào)用MoveNext()時(shí),當(dāng)前位置都會(huì)改變。MoveNext()封裝了迭代塊的代碼,并設(shè)置了current變量的值,從而使Current屬性根據(jù)位置返回一個(gè)對(duì)象。
publicclassHelloCollection
publicIEnumeratorstringGetEnumerator()
returnnewEnumerator(0);
publicclassEnumerator:IEnumeratorstring,IEnumerator,IDisposable
privateintstate;
privatestringcurrent;
publicEnumerator(intstate)
this.state=state;
boolSystem.Collections.IEnumerator.MoveNext()
switch(state)
case0:
current="hello";
state=1;
returntrue;
case1:
current="world";
state=2;
returntrue;
case2:
break;
returnfalse;
voidSystem.CollectionIEnumerator.Reset()
thrownewNotSupportedException();
stringSystem.Collections.Generic.IEnumeratorstring.Current
returncurrent;
objectSystem.Collections.IEnumerator.Current
returncurrent;
voidIDisposable.Dispose()
}
yield語(yǔ)句會(huì)產(chǎn)生一個(gè)枚舉器,而不僅僅生成一個(gè)包含的項(xiàng)的列表。這個(gè)枚舉器通過(guò)foreach語(yǔ)句調(diào)用。從foreach中依次訪問(wèn)每一項(xiàng),就會(huì)訪問(wèn)枚舉器。這樣就可以迭代大量的數(shù)據(jù),而無(wú)需一次把所有的數(shù)據(jù)都讀入內(nèi)存。
(1).迭代集合的不同方式
可以使用yieldreturn語(yǔ)句,以不同方式迭代集合。
類MusicTitles可以用默認(rèn)方式通過(guò)GetEnumerator()方法迭代標(biāo)題,該方法不必在代碼中編寫(xiě),也可以用Reverse()逆序迭代標(biāo)題,用Subset()方法迭代子集合:
publicclassMusicTitles
string[]names={
"TubularBells","HergestRidge",
"Ommadawn","Platinum"};
publicIEnumeratorstringGetEnumerator()
for(inti=0;ii++)
yieldreturnnames[i];
publicIEnumerablestringReverse()
for(inti=3;ii--)
yieldreturnnames[i];
publicIEnumerablestringSubset(intindex,intlength)
for(inti=index;iindex+length;i++)
yieldreturnnames[i];
}
客戶端代碼:
vartitles=newMusicTitles();
foreach(vartitleintitles)
Console.WriteLine(title);
Console.WriteLine();
Console.WriteLine("reverse");
foreach(vartitleintitles.Reverse())
Console.WriteLine(title);
Console.WriteLine();
Console.WriteLine("subset");
foreach(vartitleintitles.Subset(2,2))
Console.WriteLine(title);
}
(2).用yieldreturn返回枚舉器
publicclassGameMoves
privateIEnumeratorcross;
privateIEnumeratorcircle;
publicGameMoves()
cross=Cross();
circle=Circle();
privateintmove=0;
constintMaxMoves=9;
publicIEnumeratorCross()
while(true)
Console.WriteLine("Cross,move{0}",move);
if(++move=MaxMoves)
yieldbreak;
yieldreturncircle;
publicIEnumeratorCircle()
while(true)
Console.WriteLine("Circle,move{0}",move);
if(++move=MaxMoves)
yieldbreak;
yieldreturncross;
}
客戶端代碼:
vargame=newGameMoves();
IEnumeratorenumerator=game.Cross();
while(enumerator.MoveNext())
enumerator=enumerator.CurrentasIEnumerator;
}
這樣會(huì)交替調(diào)用Cross()和Circle()方法。
七.元組(Tuple)
元組可以合并不同類型的對(duì)象。元組起源于函數(shù)編程語(yǔ)言,如F#。在.NETFramework中,元組可用于所有的.Net語(yǔ)言。
.NETFramework定義了8個(gè)泛型Tuple類和一個(gè)靜態(tài)Tuple類,它們用作元組的工廠。不同的泛型Tuple類支持不同數(shù)量的元素。如,TupleT1包含一個(gè)元素,TupleT1,T2包含兩個(gè)元素。
Tuplestring,stringname=newTuplestring,string("Jochen","Rindt");
元組也可以用靜態(tài)Tuple類的靜態(tài)Create()方法創(chuàng)建。Create()方法的泛型參數(shù)定了要實(shí)例化的元組類型:
publicstaticTupleint,intDivide(intdividend,intdivisor)
intresult=dividend/divisor;
intreminder=dividend%divisor;
returnTuple.Createint,int(result,reminder);
}
可以用屬性Item1和Item2訪問(wèn)元組的項(xiàng):
varresult=Divide(5,2);
Console.WriteLine("resultofdivision:{0},reminder:{1}",result.Item1,result.Item2);
如果元組包含的項(xiàng)超過(guò)8個(gè),就可以使用帶8個(gè)參數(shù)的Tuple類定義。最后一個(gè)模板參數(shù)是TRest,表示必須給它傳遞一個(gè)元組。這樣,就可以創(chuàng)建帶任意個(gè)參數(shù)的元組了。
vartuple=Tuple.Createstring,string,string,int,int,int,double,Tupleint,int(
"Stephanie","Alina","Nagel",2009,6,2,1.37,Tuple.Createint,int(52,3490));
八.結(jié)構(gòu)比較
數(shù)組和元組都實(shí)現(xiàn)接口IStructuralEquatable和IStructuralComparable。這兩個(gè)接口不僅可以比較引用,還可以比較內(nèi)容。這些接口都是顯式實(shí)現(xiàn)的,所以在使用時(shí)需要把數(shù)組和元組強(qiáng)制轉(zhuǎn)換為這個(gè)接口。
IStructuralEquatable接口用于比較兩個(gè)元組或數(shù)組是否有相同的內(nèi)同,IStructuralComparable接口用于給元組或數(shù)組排序。
IStructuralEquatable接口示例:
編寫(xiě)實(shí)現(xiàn)IEquatable接口的Person類,IEquatable接口定義了一個(gè)強(qiáng)類型化的Equals()方法,比較FirstName和LastName的值:
publicclassPerson:IEquatablePerson
publicintId{get;privateset;}
publicstringFirstName{get;set;}
publicstringLastName{get;set;}
publicoverridestringToString()
returnString.Format("{0},{1}{2}",Id,FirstName,LastName);
publicoverrideboolEquals(objectobj)
if(obj==null)
returnbase.Equals(obj);
returnEquals(objasPerson);
publicoverrideintGetHashCode()
returnId.GetHashCode();
#regionIEquatablePersonMembers
publicboolEquals(Personother)
if(other==null)
returnbase.Equals(other);
returnthis.FirstName==other.FirstNamethis.LastName==other.LastName;
#endregion
}
創(chuàng)建兩個(gè)包含相同內(nèi)容的Person類型的數(shù)組:
varjanet=newPerson{FirstName="Janet",LastName="Jackson"};
Person[]persons1={newPerson{FirstName="Michael",LastName="Jackson"},janet};
Person[]persons2={newPerson{FirstName="Michael",LastName="Jackson"},janet};
由于兩個(gè)變量引用兩個(gè)不同數(shù)組,所以!=返回True:
if(persons1!=persons2)
Console.WriteLine("notthesamereference");
對(duì)于IStructuralEquatable接口定義的Equals方法,第一個(gè)參數(shù)是object類型,第二個(gè)參數(shù)是IEqualityComparer類型。調(diào)用這個(gè)方法時(shí),通過(guò)傳遞一個(gè)實(shí)現(xiàn)了EqualityComparerT的對(duì)象,就可以定義如何進(jìn)行比較。通過(guò)EqualityComparerT類完成IEqualityComparer的一個(gè)默認(rèn)實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)檢查T(mén)類型是否實(shí)現(xiàn)了IEquatable接口,并調(diào)用IEquatable.Equals()方法。如果該類沒(méi)有實(shí)現(xiàn)IEquatable接口,就調(diào)用Object基類中Equals()方法:
if
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年及未來(lái)5年中國(guó)長(zhǎng)袖行業(yè)市場(chǎng)發(fā)展數(shù)據(jù)監(jiān)測(cè)及投資前景展望報(bào)告
- 氫儲(chǔ)裝備生產(chǎn)線項(xiàng)目可行性研究報(bào)告
- 《GAT 2000.263-2019公安信息代碼 第263部分:攜包特征代碼》專題研究報(bào)告
- 《GAT 543.23-2023公安數(shù)據(jù)元(23)》專題研究報(bào)告
- 信息系統(tǒng)規(guī)劃與實(shí)施的實(shí)踐
- 虛擬現(xiàn)實(shí)技術(shù)在旅游體驗(yàn)中的應(yīng)用
- 金礦采選尾工程投資計(jì)劃書(shū)
- 鋼結(jié)構(gòu)幕墻熱膨脹縫設(shè)計(jì)方案
- 稅法期末題庫(kù)及答案
- 2026年市場(chǎng)調(diào)研員面試題集與解答策略
- 特殊作業(yè)之-斷路作業(yè)安全教育培訓(xùn)
- 中華醫(yī)學(xué)會(huì)麻醉學(xué)分會(huì)困難氣道管理指南
- 醫(yī)務(wù)部會(huì)議管理制度范本
- 繪本制作培訓(xùn)課件
- 客戶分配管理辦法管理
- 燃?xì)馊霊舭矙z培訓(xùn)
- 高中地理思政融合課《全球氣候變暖》
- 《山東省市政工程消耗量定額》2016版交底培訓(xùn)資料
- 《中醫(yī)六經(jīng)辨證》課件
- 掛名合同協(xié)議書(shū)
- 蘇教版高中化學(xué)必修二知識(shí)點(diǎn)
評(píng)論
0/150
提交評(píng)論