Linq--扩展方法
如果现在有一个这样的需求,求筛选出来的大于20MB的进程的和,常用的方法是写一个静态方法传进去一个ProcessData列表
比如:
public static Int64 TotalMemory( IEnumerable<ProcessData> process)
{
Int64 result = 0;
foreach(var pro in process)
{
result +=pro.Memory;
}
return result;
}
如果现在还有一个需求:将筛选出来的结果用MB表示
比如:
Public static Int64 ByteToMegaByte(Int64 bytes)
{
return bytes/1024/1024;
}
我们就要如此来使用了:ByteToMegaByte(TotalMemory())
好像这样做也很完美,但是.net有更好的方法——使用扩展方法。使用扩展发法就好像此方法真的"添加"到IEnumable<ProcessData>中一样。
修改类Programe为静态方法
注意:
1. 扩展方法必须在非泛型的静态类中
2.扩张方法的第一参数必须为带扩张的方法类型,并且用this来修饰
3.扩展方法接受任意多参数
修改后的代码如下:
public static Int64 TotalMemory( this IEnumerable<ProcessData> process)
{
Int64 result = 0;
foreach(var pro in process)
{
result +=pro.Memory;
}
return result;
}
public static Int64 ByteToMegaByte(this IEnumerable<ProcessData> process, Int64 bytes)//扩张方法的第一参数必须为带扩张的方法类型,并且用this来修饰
{
return bytes / 1024 * 1024;
}
public static void LambdaDemoDelegate(Predicate<Process> match)
{
var process = new List<ProcessData>();
Int64 res = 0;
foreach (var pro in Process.GetProcesses())
{
if (match(pro))
{
process.Add(new ProcessData { id = pro.Id, Name = pro.ProcessName, Memory = pro.WorkingSet64 });
res = process.TotalMemory();
res = process.ByteToMegaByte(res);
}
}
Array.ForEach(process.ToArray(),c=>Console.Write("id为:"+c.id+"进程名为:"+c.Name+"进程大小为:"+c.Memory+"\n"));
Console.WriteLine("筛选后的进程总共占用的内存:"+res+"MB");
}

如图中所示:ByteToMegaByte就像是本来Ienumberable<ProcessData>就有的方法,而且执行res=process.TotalMemory();
Res=process.ByteToMegaByte(res);
这样的“链式”操作。不再用ByteToMegaByte(TotalMemory(process))这样的操作了。
测试结果:

完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqDemo
{
public class ProcessData
{
public int id { get; set; }
public string Name { get; set; }
public Int64 Memory { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Xml;
using System.Diagnostics;
namespace LinqDemo
{
static class Program
{
static void Main(string[] args)
{
}
public static void LambdaDemoGeneral()
{
var process = new List<ProcessData>();
foreach(var pro in Process.GetProcesses())
{
if(pro.WorkingSet64>=20*1024*1024)
{
process.Add(new ProcessData {id=pro.Id,Name=pro.ProcessName,Memory=pro.WorkingSet64});
}
}
Array.ForEach(process.ToArray(), c => Console.Write("id为:" + c.id + "进程名为:" + c.Name + "进程大小为:" + c.Memory + "\n"));
}
public static bool Filter(Process process)
{
return process.WorkingSet64 >= 20*1024*1024;
}
public static void LambdaDemoDelegate(Predicate<Process> match)
{
var process = new List<ProcessData>();
Int64 res = 0;
foreach (var pro in Process.GetProcesses())
{
if (match(pro))
{
process.Add(new ProcessData { id = pro.Id, Name = pro.ProcessName, Memory = pro.WorkingSet64 });
res = process.TotalMemory();
res = process.ByteToMegaByte(res);
}
}
Array.ForEach(process.ToArray(),c=>Console.Write("id为:"+c.id+"进程名为:"+c.Name+"进程大小为:"+c.Memory+"\n"));
Console.WriteLine("筛选后的进程总共占用的内存:"+res+"MB");
}
public static void DelegateDemo()
{
LambdaDemoDelegate(Filter);
}
public static void LambdaDemo()
{
LambdaDemoDelegate(process=>process.WorkingSet64>=20*1000*1000);
}
public static Int64 TotalMemory( this IEnumerable<ProcessData> process)
{
Int64 result = 0;
foreach(var pro in process)
{
result +=pro.Memory;
}
return result;
}
public static Int64 ByteToMegaByte(this IEnumerable<ProcessData> process,Int64 bytes)
{
return bytes / 1024 * 1024;
}
}
}
Linq--扩展方法的更多相关文章
- Linq扩展方法之Aggregate 对序列应用累加器函数
Linq扩展方法之Aggregate 对序列应用累加器函数; 函数模板:// 函数名:对序列应用累加器函数. // Parameters:参数要求 // source:要聚合的 System.Col ...
- 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法
比如Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>&g ...
- 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用
一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...
- ABP框架源码中的Linq扩展方法
文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions ...
- 【手记】走近科学之为什么JObject不能调用LINQ扩展方法
Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>> ...
- LinQ—扩展方法
概述 本节主要解说扩展方法,涉及LinQ的详细知识不多. 扩展方法的描写叙述 .net framework为编程人员提供了非常多的类,非常多的方法,可是,不论.net framework在类中为我们提 ...
- Linq扩展方法获取单个元素
在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明 ...
- Linq扩展方法之All 、Any
// Summary: // 确定序列中的所有元素是否满足条件. // Parameters: // source:包含要应用谓词的元素的 System.Collections.Generic.IEn ...
- Stackoverflow 珠玑:用于分组的 LINQ 扩展方法
从 stackoverflow.com 上抄来的,将 IEnumerable 中的元素进行切分的方法,无动态内存分配,地球上最快的实现: public static class LinqExtensi ...
- C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询
1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...
随机推荐
- [Java] HashMap详解
转自:http://alex09.iteye.com/blog/539545 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 Hash ...
- Java基础知识强化105:打印数组的方法总结
1. 使用for循环打印数组. 2. 使用Arrays工具类,将数组转化为有序的List打印出来. 3. 使用Arrays工具类,使用Arrays.toString()输出数组内容. 上面三种方法打印 ...
- 【阿里云产品公测】大数据下精确快速搜索OpenSearch
[阿里云产品公测]大数据下精确快速搜索OpenSearch 作者:阿里云用户小柒2012 相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like ...
- jquery.blockUI.2.31.js 弹出层项目介绍
{insert_scripts files='user.js'} <style type="text/css"> #float_login{border:1px sol ...
- VMware系统运维(十四)部署虚拟化桌面 Horzion View Manager 5.2 配置许可
1.通过网页访问https://conntionserver.testad.local/admin,打开如下图所示页面:输入用户名密码 2.进来以后配置View 许可,点击"编辑许可证&qu ...
- UML类图中的六大关系:泛化、实现、依赖、关联、聚合、组合关系
UML定义的关系主要有:泛化.实现.依赖.关联.聚合.组合,这六种关系紧密程度依次加强,分别看一下 1.泛化 概念:泛化是一种一般与特殊.一般与具体之间关系的描述,具体描述建立在一般描述的基础之上,并 ...
- [转]Web Services使用out参数
本文转自:http://www.cnblogs.com/zhaozhan/archive/2010/10/25/1860837.html Web Services使用out参数,在SOAP协议中会跟返 ...
- 转: 透过CAT,来看分布式实时监控系统的设计与实现
评注: 开源的分布式监控系统 转:http://www.infoq.com/cn/articles/distributed-real-time-monitoring-and-control-syste ...
- 转: ios app架构设计
http://keeganlee.me/post/architecture/20160107 看完这一系列文章后就知道怎么回答这类问题了: App架构设计经验谈:接口的设计 App架构设计经验谈:技术 ...
- HDU4272LianLianKan(dfs)
Problem Description I like playing game with my friend, although sometimes looks pretty naive. Today ...