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, 它对程序中的元素进行标注,如类型.字段.方法 ...
随机推荐
- hg(Mercurial)版本库迁移到git版本库
这几天没事干净搞迁移了,迁移完MVC又迁移版本库,还把工作电脑迁移了一下,开始用Win8.1了.这个迁移主要是因为实在不想在工作电脑上又装git又装hg了,点个右键出来一大堆菜单,况且现在git已经成 ...
- Rolls.java (page44)
对象的数组:模拟T次投掷骰子的Counter对象的用例: Rolls.java 如下:所用类列表:Counter, StdOut, StdRandom 见page42 public class Rol ...
- orcale 列改为大字段
--添加临时列ALTER TABLE MPD_TASK_LIST ADD( CLOB_TEMP clob);--数据拷贝到临时列update MPD_TASK_LIST set CLOB_TEMP ...
- 如果AlertView输入框为空,则禁止点击确定按钮
//UIAlertView的代理方法(创建UIAlertView之后,copy此代理方法即可) - (BOOL)alertViewShouldEnableFirstOtherButton:(UIAle ...
- sublime text 3 扩展插件SideBarEnhancements用法教程
SideBarEnhancements本是增强侧边栏的插件,这里将教大家如何用来做sublime text 3浏览器预览插件,并可自定义浏览器预览的快捷键. 第一步:安装此插件,搜索相关教程,本博客有 ...
- Android处理Bitmap使其能够不失真等比缩放裁剪后显示在ImageView上
Android开发过程中,我们有时需要动态得显示一些图片,并且这些图片的大小差距会十分大,如果需求并不是需要图片完整显示,但是需要不失真,并且要图片中间部分的情况下,我们需要做一系列处理,因为这个时候 ...
- spark写入Oracle 报错 java.lang.ArrayIndexOutOfBoundsException: -32423
原因: oracle 10g的驱动执行的批量提交只支持32768个参数,如果表的字段多于32个,就会出现该异常 解决办法: 升级oracle的驱动版本,换成ojdbc6.jar
- [老老实实学WCF] 第二篇 配置WCF
老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...
- 10款很酷的HTML5动画和实用的HTML5应用
1.HTML5的画布花朵生成器可生成多种样式的花朵 HTML5非常流行,利用HTML5制作动画也非常方便,今天要分享一款利用HTML5 Canvas制作的花朵生成器,我们只需要在Canvas画布上点击 ...
- hdu 1318 Palindromes(回文词)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1318 题意分析:输入每行包含一个字符串,判断此串是否为回文串或镜像串. 表面上看这道题有些复杂,如果能 ...