第二章主要复习.net 3.0 与Linq 有关的新知识
1.隐式类型: 必须初始化不能赋值null,只是由编译器推测其类型罢了
2. 对象初始化器,集合初始化器
1,2 很简单就不介绍了
3. lamdor 表达式 涉及到委托 需要好好研究一下 委托。
4.匿名方法
5. 扩展方法
6.匿名类型
这一章看完觉得比较简单。 写一个总的例子应用上上述所有特性吧。
一:委托的例子
// 声明委托类型
public delegate bool FilterDelegate(Process p);
public class ProcessData
{
public string Name { set; get; }
public Int64 Memory { set; get; }
public Int32 ID { set; get; }
}
class Program
{
//把委托注册到方法上。
static void displayProcesses( FilterDelegate match)
{
var plist = new List<ProcessData>();
foreach (var p in Process.GetProcesses())
{
if (match(p))
{
plist.Add(new ProcessData { ID = p.Id, Memory = p.WorkingSet64, Name = p.ProcessName });
}
}
ObjectDumper.Write(plist);
}
public static bool Filter(Process pro) {
return pro.WorkingSet64 >= 20*1024*1024;
}
static void Main(string[] args)
{
// 应用委托
displayProcesses(Filter);
Console.Read();
}
}
也可以用Predict <T> 微软定义好的返回boolean 类型的委托 参数object.
优化后的代码:
static void displayProcesses( Predicate<Process> match)
{
var plist = new List<ProcessData>(); // implicitly type variant
foreach (var p in Process.GetProcesses())
{
if (match(p))
{
plist.Add(new ProcessData { ID = p.Id, Memory = p.WorkingSet64, Name = p.ProcessName });//Object initializor
}
}
ObjectDumper.Write(plist);
}
static void Main(string[] args)
{
displayProcesses(pcess => pcess.WorkingSet64 >= 20 * 1024 * 1024); // lamador Expression
Console.Read();
}
最后写一个总的例子,把应用到的技术加comment 加以标注。
public class ProcessData
{
public string Name { set; get; }
public Int64 Memory { set; get; }
public Int32 ID { set; get; }
}
static class Program
{
static void displayProcesses( Predicate<Process> match)
{
var plist = new List<ProcessData>(); // implicitly type variant
foreach (var p in Process.GetProcesses())
{
if (match(p))
{
plist.Add(new ProcessData { ID = p.Id, Memory = p.WorkingSet64, Name = p.ProcessName });//Object initializor
}
}
ObjectDumper.Write(plist);
// display total memory for process and top 2 process memory
Int64 sumMeoryTotal = plist.TotalMemory(); // extension method.
Console.WriteLine("Memory of all the process:" + sumMeoryTotal);
var tot2ProcessMemory =
plist.OrderByDescending(p => p.Memory)
.Take(2).Sum(pp => pp.Memory);
Console.WriteLine("top 2 process Memory ; " + tot2ProcessMemory);
}
static Int64 TotalMemory(this IEnumerable<ProcessData> p)
{
return p.Sum( pp => pp.Memory );
}
static Int64 TotalMemoryProcess(this IEnumerable<ProcessData> pp)
{
Int64 sum = 0;
foreach (var p in pp)
{
sum += p.Memory;
}
return sum;
}
static void Main(string[] args)
{
displayProcesses(pcess => pcess.WorkingSet64 >= 20 * 1024 * 1024); // lamador Expression
Console.Read();
}
第二张结束,主要介绍了关于linq要用的.net 3.0 的新特性。