如果现在有一个这样的需求,求筛选出来的大于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. 【Android 界面效果16】关于android四大组件的总结

    Android四大组件:Activity.Service.Broadcast receiver.Content provider 在Android中,一个应用程序可以使用其它应用程序的组件,这是And ...

  2. JS 鼠标事件大全

    一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...

  3. Linux 内核模块可选信号

    一 . 内核模块可选信号 1 . 模块申明 (1). MODULE_LICENSE(遵守的协议) 申明该模块遵守的许可证协议,如:“GPL”."GPL V2" (2). MODUL ...

  4. Linux之zsh

    0.安装zsh: sudo apt-get install zsh git wget 1.启用zsh:chsh -s /bin/zsh 2.github: https://github.com/rob ...

  5. xhtml+css基础知识1

    样式 行间样式:在标签里 <div style="width:400px; height:200px; background:red;">块</div> 内 ...

  6. 【转载】Asp.net Mvc 入门视频教程

    专辑: http://www.youku.com/playlist_show/id_2416830.html 订阅: http://www.youku.com/playlist/rss/id/2416 ...

  7. Part 17 Temporary tables in SQL Server

    Temporary tables in SQL Server

  8. Win7 服务优化个人单机版

    我的PC设备比较旧了,为了系统能流畅点,不必要的服务就不开启了.然而,服务那么多,每次重装,都要从头了解一下一边,浪费时间. 个人在网络上收集信息并结合自己的摸索,整理如下,以备查找. 服务名称  显 ...

  9. STL Container和ATL智能包裹类的冲突

    STL Container和ATL智能包裹类的冲突 载自:http://www.codesky.net/article/200504/63245.html Article last modified ...

  10. 如何给xml应用样式

    引子:可扩展标记语言xml(Extensible Markup Language)自己平常也用到的不多,除了在ajax处理服务器返回的数据可能会用到外(不过一般用json处理数据的比较常见)还真没怎么 ...