LINQ中的Func委託

2022-02-06 20:54:38 字數 1610 閱讀 7059

//建立乙個整型陣列

int intarray = new int ;

//宣告func委託, 判斷是否是奇數

funcisodd = i => ((i & 1) == 1);

//執行查詢操作, 別忘了具有"延遲特性"

ienumerableitems = intarray.where(isodd);

//顯示結果

foreach (int item in items)

console.writeline(item);

程式如我所願的找出了intarray中的奇數有哪些. 但背後func委託實質上為我們省去了哪些步驟呢? 我首先研究了linq查詢中的委託.

在我的一篇介紹lambda表示式的部落格中有乙個例子. 例子描述了這樣一種情況: 有乙個int型陣列, 需要找出其中的奇數, 偶數等等等. 下面再貼出這個例子有用部分的完整**:

using system;

using system.collections;

namespace linqtest

}//根據需要, 自己定義篩選方法

public class myintfilter

//自己定義的篩選方法2: 檢測是否是偶數

public static bool iseven(int i)

//...根據需要還可以定義其它篩選方法

}static void main(string args)

;//篩選出奇數

int oddnums = commom.filterarrayofints(nums, i => ((i & 1) == 1));

foreach (int i in oddnums)

console.write(i + " ");}}

}

這個例子自己定義的乙個commom類, 並有乙個篩選出一定要求的方法filterarrayofints, 如果我們使用擴充套件方法將filterarrayofints擴充套件到int型別, 將filterarrayofints方法名改成where, 那就很有趣了, 那麼最後篩選出奇數的**就是這個樣子的:

int nums = ;

//篩選出奇數

int oddnums = nums.where(i => ((i & 1) == 1));

是不是非常像linq中的where? 其實就是這麼個道理.

什麼意思呢? 上面的**還是有用的, 可以這樣理解, 上面**中myintfilter類中定義了很多篩選一定條件整數的方法, 有方法就會有方法返回型別, 方法如果有引數就會還有引數型別. 如下:

//自己定義的篩選方法1: 檢測是否是奇數

public static bool isodd(int i)

//自己定義的篩選方法2: 檢測是否是偶數

public static bool iseven(int i)

func委託將定義這些方法的**變得簡單, 如果是上面的這兩個方法, 利用func委託只需要這樣寫:

funcisodd = i => ((i & 1) == 1);

funciseven = i => ((i & 1) != 1);

這樣子在寫法上就比較簡單, 並且一看就明了**是什麼意思.

C 中的Func委託和Action委託

委託時物件導向的程式語言中新加入的一種特性,在c 中引入委託使得c 程式的編寫更加靈活。c 中可以自己定義各種各樣的委託,但是c 語言也預先為我們定義了兩個做常用的委託,乙個是func乙個是action.函式最基本的特點就是輸入輸出,即輸入引數 執行運算 輸出引數,action是一類沒有輸出引數的委...

c 中Action和Func委託

泛型acion委託表示引用乙個void返回型別的方法,至多可以傳遞至16個引數型別,沒有泛型的action類可呼叫沒有引數的方法,如 class test static void main string args 泛型func委託表示引用帶返回型別的方法,至多可以傳遞16個引數型別和乙個返回型別,f...

Func泛型委託

描述 封裝乙個具有乙個引數並返回tresult引數指定的型別值的方法.語法 public delegate tresult func t arg 引數型別 t 此委託封裝的方法的引數型別.tresult 此委託封裝的方法的返回值型別.引數 arg 委託封裝的方法的引數 返回值 此委託封裝的方法的返回...