如果現在有一個這樣的需求,求篩選出來的大於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;

}

}

}