如果现在有一个这样的需求,求筛选出来的大于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. [Arduino] 外部中断

    原文:http://www.arduino.cn/thread-2421-1-1.html 1.什么是中断? 试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得 ...

  2. Oracle 基础——索引

    一.索引 索引是一种快速访问数据的途径,可提高数据库性能.索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据,就像书的目录,可以快速查找所需的信息,无须阅读整本书. 二.索引存在的问题 ...

  3. Sublime Text shift+ctrl妙用

    1 :按住shift+ctrl然后按←或→可快速选中一行中的某一部分,相当于双击鼠标选中. 当你想在代码末尾加注释的话,这个方法很好用 输入文字->光标移到文字末尾->按住shift+ct ...

  4. linux yum install resource - epel

    首先现在如下rpm包,然后安装对应的rpm包centos5 32位epel源下载地址: www.lishiming.net/data/attachment/forum/epel-release-5-4 ...

  5. GSS7 spoj 6779. Can you answer these queries VII 树链剖分+线段树

    GSS7Can you answer these queries VII 给出一棵树,树的节点有权值,有两种操作: 1.询问节点x,y的路径上最大子段和,可以为空 2.把节点x,y的路径上所有节点的权 ...

  6. python连接字符串的方式

    发现Python连接字符串又是用的不顺手,影响速度 1.数字对字符进行拼接 s=""  #定义这个字符串,方便做连接 print type(s) for i in range(10 ...

  7. 获取IOS bundle中的文件

    在xcode中选择bundle中的文件,右键Show in Finder即可拷贝或删除文件.

  8. sql语句使用游标修改表中数据

    declare @a varchar(),@b varchar() declare user_cursor cursor for select a,b from tableA tab open use ...

  9. 2015影响因子Excel版

    现在终于有影响因子2015的Excel版了,这个版本除了还包括杂志全称和缩写等基本信息还,包括中科院分区, 应该是迄今2015影响因子最奢华的版本了吧. 看了这个版本,发现中国的SCI杂志还是不少的, ...

  10. MySQL中DATE_FORMATE函数内置字符集解析

    今天帮同事处理一个SQL(简化过后的)执行报错: 代码如下 复制代码 mysql> select date_format('2013-11-19','Y-m-d') > timediff( ...