自定義集合型別(續)

2021-09-04 10:13:40 字數 2851 閱讀 3568

其實我們組合c#的一些知識,來實現這個功能:

首先定義乙個委託:

delegate bool fun(user user);

這個委託是接收乙個user型別的引數,以乙個bool型別作為返回值。

再次在users集合類中定義乙個查詢方法:

public user first(fun predicate)

} return null; }

方法的引數是接收乙個fun的委託型別,也就是乙個方法,引數predicate在first內就代表乙個方法,first方法體是迴圈users內users這個泛型的list集合,把每個子項當引數傳進predicate方法,如果predicate方法返回值為true,就把這個泛型集合的中的user當成first方法的返回值返回去,總而言之,first方法是從集合查詢滿足predicate方法的使用者,並返回。

再次,我們來使用一下users中的這個first方法:

應用程式中建立**如下:

users users =

new users();

user user1 = new user();

user1.id = 1;

user1.username = "張三";

user1.password = "111111";

users.adduser(user1);

user user2 = new user();

user2.id = 2;

user2.username = "李四";

users.adduser(user2);

messagebox.show(users.first(user => user.id == 1).tostring());//這是在winform下面的顯示

user => user.id == 1代表乙個方法,不過是匿名方法,前面乙個user是引數,後面的user.id==1的返回值作為匿名方法的返回值,這個匿名方法,與委託fun正好對應上,即引數是user,返回值是bool。

當然,user=>user.id==1只是一種寫法,我們還可以寫成user=>user.username==」aaaa」,或寫成user=>user.usernmae==」aaaa」&&user.password==」111111」,「=>」符號右邊的表示式只要是個bool型別就可以。正是因為這個匿名方法,我們查詢的條件就變成靈活的了,而不用專門定義不同型別的查詢方法來適應不同的查詢了。

也可能,這時,你已經想到,在linq中,也是這樣實現的,對,這種寫法與linq中的查詢語法是一樣的。

不過,在linq中,這些擴充套件了的查詢語法的方法,不是在具體的某乙個集合類中定義的,而是在乙個靜態類中定義的,這個靜態類叫enumerable,它是乙個擴充套件方法的類,內部包括很多個擴充套件方法,比如內部的

first方法,它是給實現了ienumerable介面的類擴充套件的乙個方法,只要實現這個介面的類,就能呼叫這些查詢語法的擴充套件方法。我們在使用陣列時可以使用查詢語法的方法,在list集合中也可以,這都是因為它們都實現了ienumerable的介面。

換言之,如果我們把users也實現ienumerable介面,users也自然就擁有像first,where這些查詢語法的方法了。而不像上面那樣(users類中的first方法),需要自己乙個乙個去實現所有的擴充套件方法了。

但由於ienumerable是個泛型的介面,把以users類也就需要定義成泛型了,為了使users專用,我們在users定義時,使用了泛型的約束,t是user類,或它的子類都可以。

class

users: ienumerable, ilistsource, ienumerable where t : user

} ///

/// 使用者集合

///

listusers = new list();

///

/// 使用者

///

/// 使用者id

///

public t this[int id]

} return default(t); }

set

} }

} ///

/// 新增使用者

///

/// 使用者

public void adduser(t user)

///

/// 移除使用者

///

/// 使用者

public void removeuser(t user)

///

/// 獲得使用者數量

///

public int count

} ///

/// 是否包含list

///

public bool containslistcollection

} ///

/// 返回集合

///

///

public system.collections.ilist getlist()

///

/// 實現對users的foreach遍歷

///

///

public ienumerator getenumerator()

} }

其實如果限制了t為user類或它的子類,在一定程度上這個users類的使用就很受限制了,如果不限制t受user約束,那麼users就不一定是user的集合了,因為t決定了這個集合是什麼型別的集合,此時的users更像list了(users中的成員,還是要少於list中的成員的,因數在users中我們僅定義了add,remove,count,索引器等成員)。

通過上面的例子,我們能了解到,查詢條件可以自定義,也可以通過繼承ienumerable介面來擴充套件查詢,這要根據自己的應用決定使用那一技術了。

自定義集合型別(續)

其實我們組合c 的一些知識,來實現這個功能 首先定義乙個委託 delegate bool fun user user 這個委託是接收乙個user型別的引數,以乙個bool型別作為返回值。再次在users集合類中定義乙個查詢方法 public user first fun predicate retu...

自定義集合型別

很多時候我們去自定義一些型別,更有些時候我們會把這些自定義型別封裝成集合,比如說現在有乙個自定義型別user 使用者 class user 使用者名稱 public string username 使用者這密碼 public string password 一般情況下,我們封裝集合時,是用泛型的li...

自定義集合型別

很多時候我們去自定義一些型別,更有些時候我們會把這些自定義型別封裝成集合,比如說現在有乙個自定義型別user 使用者 class user 使用者名稱 public string username 使用者這密碼 public string password 一般情況下,我們封裝集合時,是用泛型的li...