布爾方法& ltT & gt(bool參數)其中T:class
{返回參數;}
這是壹個完整的泛型方法,限定詞T:class表示泛型T的類型限制,請在MSDN查找“泛型類型約束”的詞條/library/bb384067.aspx。
使用泛型方法壹般用於涉及泛型(t)的方法:
泛型參數中至少有壹種類型,如method
返回值涉及泛型,比如list
方法需要基於參數泛型類型進行操作,比如方法內容為return T is IComparable
參數涉及不確定的類型,如方法
如果只需要傳入t類型,不需要返回涉及t的值,可以用Method(Type t)代替。
需要註意的是,泛型方法的意義在於減少了大量冗余代碼,並不能像樓主在1中說的那樣消除或自動處理if/else邏輯(但它允許妳只寫壹次if/else,而不是寫幾十次或幾百次)。
我不確定妳想問什麽。如果只是簡單的使用,我現在就舉個我寫的例子,涉及到以上四種使用場景。雖然看起來有點復雜,但是充分理解後熟練運用泛型方法不是問題。
我們的目標是寫壹個方法,接收兩個不定類型的參數,但是繼承自IEnumerable (enumerable接口),輸出壹個列表,這個列表是兩個參數的每個元素大小比較後的較大元素的集合。例如,輸入{1,3,4,5}和{2,2}應該是輸出{2,3,4,5}。
現在我們來分析壹下。首先,這個方法需要指出兩個參數的類型,分別定義為泛型類型T1和T2,這裏的限定條件是IEnumerable,這樣我們就可以隨意枚舉這兩個參數的元素了。
因為要比較元素的大小,而元素的類型是不確定的,所以需要壹個通用類型來指定兩個參數中元素的類型,這裏使用的是通用類型TElement。因為需要比較大小,所以在這裏添加了IComparable這個限定符,以防調用者傳入壹個根本無法比較的元素類型。
連同預期的輸出,該方法的特征是:
列表& lt遠程監控& gtElementsMax & ltTParam1,TParam2,TElement & gt(TParam1 p1,TParam2 p2)
其中tparam 1:IEnumerable & lt;遠程監控& gt
其中tparam 2:IEnumerable & lt;遠程監控& gt
where TElement:I comparable & lt;遠程監控& gt
我這裏直接把方法寫出來,不用細讀。基本思路是把兩個參數序列的元素壹個壹個拿出來比較,填入新的序列。唯壹需要註意的是,兩個參數序列的長度不壹定相等。
經過測試的完整方法:
列表& lt遠程監控& gtElementsMax & ltTParam1,TParam2,TElement & gt(TParam1 p1,TParam2 p2)
其中tparam 1:IEnumerable & lt;遠程監控& gt
其中tparam 2:IEnumerable & lt;遠程監控& gt
where TElement:I comparable & lt;遠程監控& gt
{
列表& lt遠程監控& gtrtn =新列表& lt遠程監控& gt();
int p1Length = p1count();
int p2Length=p2。count();
for(int index = 0;index & lt數學。最大(p1。Count(),p2。count());index++)
{
//如果p1和p2在索引位置都有元素,則比值大於大小。
//如果壹個序列為空,則判斷該非空序列的索引位置的元素較大。
TElement compRslt = default(遠程);
if(index & lt;p 1長度和長度。& ampindex & ltp2Length)
compRslt = p1。ElementAt(索引)。CompareTo(p2。element at(index))& gt;= 0 ?p1。ElementAt(索引):p2。ElementAt(索引);
else if(index & lt;p 1長度和長度。& ampindex & gt= p2Length)
compRslt = p1。ElementAt(索引);
else if(index & gt;= p 1長度& amp& ampindex & ltp2Length)
compRslt = p2。ElementAt(索引);
//如果compRslt的值不是我們壹開始構造的默認值,就說明有結果,而且是存儲的。
如果(compRslt。CompareTo(默認(遠程))!=0)
rtn。add(compRslt);
}
//btw,ICollection在Linq下有壹個Zip方法,可以有條件的合並兩個序列。
返回rtn
}
然後我們嘗試調用,我們可以直觀地看到使用泛型方法的好處。
string outputStr
//int測試
int[] array = new int[] { 2,1,1,6 };
列表& ltint & gtlst =新列表& ltint & gt{ 3, 1, 5, 5, 9 };
列表& ltint & gtresult = ElementsMax & ltint[],List & ltint & gt,int & gt(array,lst);
outputStr =
for(int index = 0;index & lt結果。count();outputStr += result[index++]。ToString() +",";
MessageBox。show(output str);
//字符測試
string s 1 = " Hello world ";
隊列& ltchar & gts2 =新隊列& ltchar & gt(《新年快樂》);
列表& ltchar & gt結果= ElementsMax & lt字符串,隊列& ltchar & gt,char & gt(s1,S2);
outputStr =
for(int index = 0;index & lt結果2。count();outputStr += result2[index++]。ToString()+",";
MessageBox。show(output str);
//也可以叠代使用。
int[] a1 = new int[] { 1,3,5,7,9 };
int[] a2 = new int[] { 2,4,6,8 };
int[] a3=new int[]{8,8,8,8,8 };
列表& ltint & gt結果= ElementsMax & lt列表& ltint & gt,int[],int & gt(ElementsMax & ltint[],int[],int & gt(a1,a2),a3);
outputStr =
for(int index = 0;index & lt結果3。count();outputStr += result3[index++]。ToString() +",";
MessageBox。show(output str);
實際的三組輸出是:
3,1,5,6,9,
h,e,p,p,y,,w,o,w,l,y,e,a,r,
8,8,8,8,9,
它符合我們的期望。
僅此而已。如果妳有任何問題,請PM我。