如果现在有一个这样的需求,求筛选出来的大于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--扩展方法的更多相关文章

  1. Linq扩展方法之Aggregate 对序列应用累加器函数

    Linq扩展方法之Aggregate  对序列应用累加器函数; 函数模板:// 函数名:对序列应用累加器函数. // Parameters:参数要求 // source:要聚合的 System.Col ...

  2. 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法

    比如Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>&g ...

  3. 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用

    一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...

  4. ABP框架源码中的Linq扩展方法

    文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions ...

  5. 【手记】走近科学之为什么JObject不能调用LINQ扩展方法

    Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>> ...

  6. LinQ—扩展方法

    概述 本节主要解说扩展方法,涉及LinQ的详细知识不多. 扩展方法的描写叙述 .net framework为编程人员提供了非常多的类,非常多的方法,可是,不论.net framework在类中为我们提 ...

  7. Linq扩展方法获取单个元素

    在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明 ...

  8. Linq扩展方法之All 、Any

    // Summary: // 确定序列中的所有元素是否满足条件. // Parameters: // source:包含要应用谓词的元素的 System.Collections.Generic.IEn ...

  9. Stackoverflow 珠玑:用于分组的 LINQ 扩展方法

    从 stackoverflow.com 上抄来的,将 IEnumerable 中的元素进行切分的方法,无动态内存分配,地球上最快的实现: public static class LinqExtensi ...

  10. C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

    1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...

随机推荐

  1. hg(Mercurial)版本库迁移到git版本库

    这几天没事干净搞迁移了,迁移完MVC又迁移版本库,还把工作电脑迁移了一下,开始用Win8.1了.这个迁移主要是因为实在不想在工作电脑上又装git又装hg了,点个右键出来一大堆菜单,况且现在git已经成 ...

  2. Rolls.java (page44)

    对象的数组:模拟T次投掷骰子的Counter对象的用例: Rolls.java 如下:所用类列表:Counter, StdOut, StdRandom 见page42 public class Rol ...

  3. orcale 列改为大字段

    --添加临时列ALTER TABLE MPD_TASK_LIST ADD(  CLOB_TEMP clob);--数据拷贝到临时列update MPD_TASK_LIST set CLOB_TEMP ...

  4. 如果AlertView输入框为空,则禁止点击确定按钮

    //UIAlertView的代理方法(创建UIAlertView之后,copy此代理方法即可) - (BOOL)alertViewShouldEnableFirstOtherButton:(UIAle ...

  5. sublime text 3 扩展插件SideBarEnhancements用法教程

    SideBarEnhancements本是增强侧边栏的插件,这里将教大家如何用来做sublime text 3浏览器预览插件,并可自定义浏览器预览的快捷键. 第一步:安装此插件,搜索相关教程,本博客有 ...

  6. Android处理Bitmap使其能够不失真等比缩放裁剪后显示在ImageView上

    Android开发过程中,我们有时需要动态得显示一些图片,并且这些图片的大小差距会十分大,如果需求并不是需要图片完整显示,但是需要不失真,并且要图片中间部分的情况下,我们需要做一系列处理,因为这个时候 ...

  7. spark写入Oracle 报错 java.lang.ArrayIndexOutOfBoundsException: -32423

    原因: oracle 10g的驱动执行的批量提交只支持32768个参数,如果表的字段多于32个,就会出现该异常 解决办法: 升级oracle的驱动版本,换成ojdbc6.jar

  8. [老老实实学WCF] 第二篇 配置WCF

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...

  9. 10款很酷的HTML5动画和实用的HTML5应用

    1.HTML5的画布花朵生成器可生成多种样式的花朵 HTML5非常流行,利用HTML5制作动画也非常方便,今天要分享一款利用HTML5 Canvas制作的花朵生成器,我们只需要在Canvas画布上点击 ...

  10. hdu 1318 Palindromes(回文词)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1318 题意分析:输入每行包含一个字符串,判断此串是否为回文串或镜像串. 表面上看这道题有些复杂,如果能 ...