今天把学习
LINQ TO ONJECT
的东西分享一下,主要把书上东西拿出来,加上自己的一点疑问。
举报
|
第一部分主要是 LINQ 操作数组。第二部分操作字符串 操作数组主要有静态数组、动态数组、泛型列表、泛型排序列表、泛型双向列表、泛型队列、泛型堆栈、泛型哈希表、泛型排序字典、泛型通用集合、泛型绑定列表十一种。 一、 操作数组 1) 静态数组 所谓静态数组指事先规定了数组的长度。比如 int [] ints = { 0,9,2,3,7,5,4,6,1,8 }; UserInfo[] ui = new UserInfo[5]; List <UserInfo> lui = new List<UserInfo>(10); 下面给出一个具体例子: private void StringArrayQuery()
查询结果 chang,xiang 2) 注意:数组类型不是基础类型,则需要进行类型转换 ArrayList users = new ArrayList();
运行结果为: (4,User014) 3) 操作泛型列表List<T> 注意:泛型列表通过索引访问,其中元素不是排序的,,可以包含重复元素或NULL,可以使用相等比较器,也可以使用排序比较器。 其中对于每一个类型T来说要实现排序方法必须重写比较的接口。
Response.Write("<br />"); 运行结果如下 ///构建数据源
Response.Write("<br />"); 运行结果如下: (0,User02) 4) 泛型排序列表StordList<Tkey,Tvalue> 泛型排序是“键/值”对组成,其中键必须是唯一的,不能修改不能为空,可以按照键值排序,可以比较和排序。可以根据键来获取指向的值。 ///构建数据源
users.Add(i, new UserInfo(i,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com"));
Response.Write("<br />"); 运行结果 (9,User09)
5) 泛型双向链表可以通过当前元素直接访问其后续和前驱元素。如果为空则其First 和Last都为空 AddBefore,AddAfter通过这两个属性添加 代码入下 ///构建数据源
运行结果如下: chang06=>chang05=>chang04=>chang03=>chang02=>chang01=>chang0=> LINQ TO OBJECTS非实名,信息自行甄别6) 泛型队列 Queue<T> 队列是先进先出的线性表,类似两头透气的管,这头先进那头先出。允许有重复元素并且为空Enqueue(T)进站操作,出站操作Dequeue()返回一个T, 例子如下 ///构建数据源 Queue<UserInfo> users = new Queue<UserInfo>(); for (int i = 1; i < 10; i++) { users.Enqueue(new UserInfo(i % 2,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com")); } ///查询泛型队列 var values = from u in users orderby u.ID,u.Username select u; ///显示查询结果 foreach (var v in values) { Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>"); } Response.Write("<br />"); 结果如下 (0,User02) (0,User04) (0,User06) (0,User08) (1,User01) (1,User03) (1,User05) (1,User07) (1,User09) 7) 泛型堆栈是一个先进后出的线性表,类似一个这头进这头出的管子。除此之外性质和QUEUE 一样。操作主要有Push(T)将T压入堆栈,Pop()饭后盏顶元素 代码如下: ///构建数据源 Stack<UserInfo> users = new Stack<UserInfo>(); for (int i = 1; i < 10; i++) { users.Push(new UserInfo(i % 2,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com")); } ///查询泛型堆栈 var values = from u in users select u; ///显示查询结果 foreach (var v in values) { Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>"); } Response.Write("<br />"); 结果如下 (1,User09) (0,User08) (1,User07) (0,User06) (1,User05) (0,User04) (1,User03) (0,User02) (1,User01) 和正常的出站顺序一致。 8) 操作哈希集合,提供高性能集合,如并集交集等。不考虑排序、不包含重复元素。 HashSet<UserInfo> users = new HashSet<UserInfo>(); for (int i = 1; i < 10; i++) { users.Add(new UserInfo(i % 2,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com")); } ///查询泛型哈希表 var values = from u in users //orderby u.ID,u.Username select u; ///显示查询结果 foreach (var v in values) { Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>"); } Response.Write("<br />"); (1,User01) 结果 (0,User02) (1,User03) (0,User04) (1,User05) (0,User06) (1,User07) (0,User08) (1,User09) 9)操作泛型字典 Dictionary<Tkey,TValue>,键值对的集合,键不能修改不能为空唯一。值可以为空和sortlist差不多 代码如下 Dictionary<int,UserInfo> users = new Dictionary<int,UserInfo>(); for (int i = 1; i < 10; i++) { users.Add(i,new UserInfo(i,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com")); } ///查询排序泛型字典 var values = from u in users orderby u.Value.ID,u.Value.Username select u; ///显示查询结果 foreach (var v in values) { Response.Write("(" + v.Value.ID.ToString() + "," + v.Value.Username + ")</br>"); } Response.Write("<br />"); 需要通过键->值->T-> 属性逐步得到 结果为 (1,User01) (0,User02) (1,User03) (0,User04) (1,User05) (0,User06) (1,User07) (0,User08) (1,User09) 10)通用集合 Collection<T> 和List差不多但是可以通过扩展他事先更复杂的操作。 具体操作部写了.. 11)泛型绑定列表 支持数据绑定的泛型集合,提供IbindingList的具体实现时创作双向绑定机制的基类,通过ADDnew()支持工厂创建实例。 (本人不是很明白说的这啥意思) 12 )泛型排序列表SortedDictionary<Tkey,Tvalue> ///构建数据源 SortedDictionary<int,UserInfo> users = new SortedDictionary<int,UserInfo>(); for (int i = 1; i < 10; i++) { users.Add(i,new UserInfo(i,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com")); } ///查询排序泛型字典 var values = from u in users orderby u.Value.ID,u.Value.Username select u; ///显示查询结果 foreach (var v in values) { Response.Write("(" + v.Value.ID.ToString() + "," + v.Value.Username + ")</br>"); } Linq我个人觉得在速度上比ADO要快很多,并且操纵简单,但是作为一种新的技术要看用的合适不合适。还有我这里发现两个问题: 第一个操作存储过程的时候,如果存储过程 有两个 查询 Select * from a Select *from b 在LINQ TO SQL 类中自动生成如下 [Function(Name="dbo.Pr_GetUsersAndRoles")] public ISingleResult<Pr_GetUsersAndRolesResult> Pr_GetUsersAndRoles() { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return ((ISingleResult<Pr_GetUsersAndRolesResult>)(result.ReturnValue)); } 但是调用的时候 LinqDBDataContext db = new LinqDBDataContext(LinqSystem.LinqDBConnectionString); ///获取分类结果 System.Data.Linq.IMultipleResults result = db.Pr_GetUsersAndRoles().; ///显示用户信息 foreach (UserInfo u in result.GetResult<UserInfo>()) { Response.Write("ID:" + u.ID.ToString() + ","); Response.Write("Username:" + u.Username + ","); Response.Write("Email:" + u.Email + "。<br />"); } ///显示角色信息 foreach (Role r in result.GetResult<Role>()) { Response.Write("ID:" + r.ID.ToString() + ","); Response.Write("RoleName:" + r.RoleName + "。<br />"); } 就会提示出错 CS0266: 无法将类型“System.Data.Linq.ISingleResult<Pr_GetUsersAndRolesResult>”隐式转换为“System.Data.Linq.IMultipleResults”。存在一个显式转换(是否缺少强制转换?) 如果将存储过程中返回的值改为如下 public IMultipleResults<Pr_GetUsersAndRolesResult> Pr_GetUsersAndRoles() { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return ((IMultipleResults<Pr_GetUsersAndRolesResult>)(result.ReturnValue)); 也会出现错误有没遇到过,,请拍砖? 第二个问题就是如何选择不同的集合,,就是什么情况下用什么集合?这个问题我觉得比较重要,很简单的例子比如哈希表和泛型字典的区别在吗?请拍砖,请高手指点,其中大部分是书上例子,小部分作了改动。 |
LINQ 头objects
最新推荐文章于 2024-09-09 14:05:11 发布