这两天在家休息,就研究了下现在比较流行的Linq查询,以及lambda表达式和Func委托与Action委托,做了一些基础的测试,下面贴出代码,如有错误疏忽之处,请指出。

代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class LinqSelect : System.Web.UI.Page
{

public static int times = 0;

/*
*Linq查询,从一般的集合中检索一定的数据,一般可分为查询执行和立即执行,下面分别做一些解释:
*查询执行:按照相关说法,Linq查询在定义的时候并不会检索集合中的数据,即定义一个Linq查询而不去遍历这个结果集的话,Linq查询的检索操作将不会被执行;
*立即执行:即定义了Linq查询后就执行,这种定义需要将Linq查询转换为ToArray()或者ToList();
*
*官方说法:在 LINQ 中,查询的执行与查询本身截然不同;换句话说,如果只是创建查询变量,则不会检索任何数据。
*官方地址:http://msdn.microsoft.com/zh-cn/library/bb397906.aspx 官方网址对上面二者进行了较好的描述
*/

protected void Page_Load(object sender, EventArgs e)
{
//定义数据源
var numlist = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

//第一种定义方式:查询执行,定义了query对象后,实质上没有做任何的检索操作,待后面用到foreach后才执行这个query查询;
var query = from i in numlist
where i > 3 && i < 8
orderby i descending
select i;
//select query
foreach (var a in query)
{
Response.Write(a.ToString() + "<br />");
}

//第二种定义方式:立刻执行,将Linq查询强制转换为某种类型,这样赋值给变量;
var query01 = (from i in numlist
where i % 2 == 0
orderby i ascending
select i).Reverse<int>().ToArray();//经此,query01的类型为int[]
foreach (var a in query01)
{
Response.Write(a.ToString() + "<br />");
}

//第三:连接两个Linq查询的结果集,关键方法(Contact),排除数组中的元素4和5
var query02 = (from a in numlist
where a % 2 == 0 && a != 4
orderby a descending
select a).Concat(
from b in numlist
where b % 2 == 1 && b != 5
orderby b ascending
select b);
foreach (var c in query02)
{
Response.Write(c.ToString() + "<br />");
}
//第四:使用group by 子句,执行Linq查询
IList<GoodsEntity> goodsList = new List<GoodsEntity>();
for (var i = 1; i <= 20; i++)
{
goodsList.Add(new GoodsEntity(i.ToString(), "GoodsName", (i < 10 ? "001" : "002")));
}
var query03 = from goods in goodsList
where goods.ClsID.Length > 0
group goods by goods.ClsID into jh
select jh;
/*根据多个字段/条件分组
var query04 = from goods in goodsList
group goods by new { goods.GdId, goods.ClsID } into jh
select jh;
*/
/* 查询条件保存至匿名类中,
* 以下查询将结果保存至一个匿名类中,并赋予属性:clsid,g,属性可以随便加,不过要注明每个属性的类型
var query05 = from goods in goodsList
group goods by goods.ClsID into g
select new
{
clsid = g.Key,
g
};
foreach (var x in query05)
{
Response.Write(x.clsid);
foreach (GoodsEntity gd in x.g)
{
Response.Write(gd.Name + "<br />");
}
}
*/

foreach (var gd in query03)//遍历每个组信息
{
Response.Write("<br />分类" + gd.Key.ToString() + "下的商品列表:<br />");
foreach (GoodsEntity good in gd)//遍历当前组下的列表信息
{
Response.Write(good.GdId + ":" + good.Name + "<br />");
}
}

//第五:关于使用Linq查询ArrayList数据源,需要指明变量的类型
var list = new ArrayList();
for (var i = 1; i < 20; i++)
{
list.Add(new GoodsEntity(i.ToString(), "sweet", (i < 10 ? "001" : "002")));
}
var queryforArrayList = from GoodsEntity goods in list// 在from后面加上goods的类型
where int.Parse(goods.GdId) >= 5 && int.Parse(goods.GdId) <= 10
select goods;
foreach (GoodsEntity good in queryforArrayList)
{
Response.Write(string.Format("编号:{0},名称:{1}<br />", good.GdId, good.Name));
}
//第六:Linq查询的方法语法(扩展方法),直接用数据源.where/orderby ....
//数据源
string[] arr = new[] { "C#", "VB", "Flex", "JS", "Ajax" };
//IOrderedEnumerable<string> ss = arr.Where(ele => ele.Length > 2).OrderByDescending(ele => ele.Length);
string[] result = arr.Where(ele => ele.Length > 2).OrderByDescending(ele => ele.Length).ToArray<string>();//终于知道lamda表达式的好处了
string[] jieguo = arr.Where<string>(new Func<string, bool>(testss)).ToArray<string>();//这种写法与lamda写法效果相同,只是lamda更方便
Response.Write("<br />");
foreach (string s in jieguo)
{
Response.Write(s + ",");
}
//Func与Action委托
Func<int, int> fdel = getSquare;
//Func<int, int> xx = new Func<int, int>(getSquare);//此定义与以上定义方式一致
Response.Write("<br />使用Func<>泛型委托要求必须有返回值,本次返回值为:" + fdel(9).ToString() + "<br />");
Action act = new Action(HelloWorld);//无参委托
act();
Action<string> strAct = new Action<string>(WriteMsg);
strAct(null);
strAct("C#.Action");
Response.Write("<br />次数:" + times.ToString());
}

//与lamda表达式对比,原理可能是差不多的
private bool testss(string s) { times++; if (s.Length > 2) return true; else return false; }

#region Method For Delegate
private int getSquare(int x)
{
return x * x;
}

private void HelloWorld()
{
Response.Write("<br />Hello,World!<br />");
}

private void WriteMsg(string msg)
{
if (msg != null)
Response.Write("<br />本次执行的参数为:" + msg.ToString());
else
Response.Write("本次执行没有参数。");
}
#endregion

}

//分类实体类
public class ClassEntity
{
private string clid;
private string name;
/// <summary>
/// 分类编号
/// </summary>
public string ClId { set; get; }
/// <summary>
/// 分了名称
/// </summary>
public string Name { set; get; }
}
//商品类
public class GoodsEntity
{
private string gdid;
private string name;
private string clsid;
/// <summary>
/// 商品编号
/// </summary>
public string GdId { set; get; }
/// <summary>
/// 商品名称
/// </summary>
public string Name { set; get; }
/// <summary>
/// 商品分类编号
/// </summary>
public string ClsID { set; get; }

public GoodsEntity() { }

public GoodsEntity(string id, string name, string clsid)
{
this.GdId = id;
this.Name = name;
this.ClsID = clsid;
}
}

关于Func委托与Action委托,推荐学习地址:http://www.cnblogs.com/wjfluisfigo/archive/2010/04/08/1512556.html

下载测试:代码

纠正一下:原来代码里面把lambda表达式写成了lamda表达式,呵呵,感谢 Arthas-Cui 的指出,也提醒下大家,跟着感觉走的时候偶尔还是要验证一下。

转载于:https://www.cnblogs.com/Eson/archive/2010/05/14/1735588.html

C#.NET的Linq查询、lambda、委托:Func和Action相关推荐

  1. 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

    一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. 1 ...

  2. C#委托·特性·linq查询.线程

    目录 泛型 泛型类 泛型方法 委托 委托基本知识 泛型委托 Action委托 Func委托 多播委托 匿名函数 lambda表达式 观察者设计模式(事件) LINQ查询语句 反射和特性 特性 线程 委 ...

  3. 《C# 语言入门详解(刘铁锰) - 学习笔记 - Lambda表达 / Linq查询》

    Lambda表达 / LINQ查询 文章目录 Lambda表达 / LINQ查询 前言 一.Lambda表达式 二.LINQ查询 前言 Lambda表达式: 匿名方法.inline(内联)方法.(简化 ...

  4. C# 3.0通过Linq、Lambda、匿名函数、代理函数实现数据查询

    这几天,正在学习Linq.Lambda,做了些实验,通过Linq.Lambda.匿名函数.代理函数4种方式实现一个简单的查询,把实现结果记录一下,以免忘记.       这段代码中有一个Person类 ...

  5. [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    此文章非原创,转载自诗人江湖老,原文地址 在Git上下载源码 在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找.过滤等等常见的任务的时候 ...

  6. Asp.Net MVC +EF(2)Linq查询和Lambda表达式

    Linq简介 Linq全称Language Integrated Query(语言集成查询),为我们提供一种统一的方式来查询和操作各种数据. linq to object:是针对实现IEnumerab ...

  7. linq查询不包含某个值的记录_【翻译】C#表达式中的动态查询

    当您使用LINQ来处理数据库时,这种体验是一种神奇的体验,对吗?你把数据库实体像一个普通的收集,使用Linq中像Where,Select或者 Take,这些简单的使用就能让代码可用了. 但是,让我们考 ...

  8. APS.NET MVC + EF (01)---Linq和Lambda表达式

    APS.NET MVC + EF (01)---Linq和Lambda表达式 1.1 Linq介绍 LINQ全称 Language Integrated Query(语言集成查询).为我们提供一种统一 ...

  9. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...

  10. Db4o结合Linq、Lambda表达式的简单示例

    大多数人接触Db4o的查询,都是从"样本查询"(Query by Example)开始的,这种查询方式简单但不方便,功能和性能也很受局限.以下是引自官方的样本查询示例: // re ...

最新文章

  1. java代码使用http请求解压zip包并解析xml_Javascript 是如何解析 Excel 文件的?
  2. springboot:映射静态资源路径
  3. 王道 —— 进程通信
  4. 【源码】H5+JS混合实现《Just Do 8》app游戏源码分享
  5. HandlerInterceptor 处理器拦截器的用法
  6. 关于websocket兼容IE版本
  7. 腾讯大战360之观战指南
  8. 修复XP图片和传真查看器!
  9. echart 广州3d_datav比较echart
  10. 【2019.06.21】基于Airtest的微信朋友圈自动点赞脚本设计与实现 2019.06.21脚本正常运行
  11. Oracle sql 按指定顺序产生序列号
  12. php将一维数组转换成二维数组
  13. 什么是NFV?它与SDN有什么关系?
  14. linux网络打印机安装步骤,科学网—CentOS6.5上使用cups安装网络打印机 - 王敏玲的博文...
  15. php实现支付宝二维码支付
  16. (算法篇)Java实现删除链表倒数第n个节点
  17. 洛谷P2738 [USACO4.1]篱笆回路Fence Loops(Floyed求最小环)
  18. JavaScript(JS) 浏览器中设置启用或禁用
  19. 2004年11月11日
  20. 私人云/让web客户端可显示服务器目录(二)

热门文章

  1. 热烈庆祝排名进入5000
  2. 管理感悟:如何改造代码
  3. 这台计算机的rsa密匙如下怎解决,win10系统使用计划任务提示账户密钥集不存在错误代码0x80090016怎么办...
  4. 中职计算机课程授课类型,中职计算机课程「任务引领型」教学方法初探
  5. idea 新建spring clound 项目_手把手教你spring源码搭建
  6. 大学python考试会挂科吗_学姐含泪劝告:4个“最难学”的大学专业,考试“挂科”是常态...
  7. 在python中使用csv读写CSV
  8. Golang让协程交替输出
  9. Android Realm(数据库)
  10. 玩转Citrix XenApp中的IE发布 (上)