其實我們組合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...