深入理解C#
1. list排序以及搜索
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication16
{
public class Product
{
string name;
public string Name
{
get { return name; }
}
decimal price;
public decimal Price
{
get { return price; }
}
public Product(string n, decimal d)
{
this.name = n;
this.price = d;
}
}
class Program
{
static void Main(string[] args)
{
List<Product> plist = new List<Product>();
plist.Add(new Product("C#", 10));
plist.Add(new Product("java", 8));
plist.Add(new Product("C++", 15));
//C#2.0 不需要实现比较接口进行排序
plist.Sort((x, y) =>x.Price.CompareTo(y.Price));
//扩展方法进行排序orderby
foreach (var item in plist.OrderBy(p=>p.Price))
{
Console.WriteLine(item.Price);
}
Predicate<Product> test = x => x.Price > 10;
List<Product> matches = plist.FindAll(test);
Action<Product> print = Console.WriteLine;
matches.ForEach(print);
foreach (var item in matches)
print(item);
Action<String> printStr = Console.WriteLine;
foreach (var item in plist.Where(p => p.Price > 8))
printStr(item.Name);
Console.Read();
}
}
}
C#1核心 委托:如果代码想要执行操作,但又不知道操作细节,一般可以用委托
构成1:声明委托类型2.必须有一个方法包含了要执行的代码3.创建一个委托实例4.调用委托实例
将事件看做类似于属性(property)的东西是很有好处的。首先,两者都声明为具有
一种特定的类型。对于事件来说,必须是一个委托类型。
使用属性时,感觉就像是直接对它的字段进行取值和赋值,但你实际是在调用方法,也就
是取值方法和赋值方法①。实现属性时,可以在那些方法中做任何事情。但凑巧的是,大多数
属性都只是实现了简单的字段,有时会在赋值方法中添加一些校验机制,有时则会添加一些线
程安全性。
同样,在订阅或取消订阅一个事件时,看起来就像是在通过+=和-=运算符使用委托类型的
字段。但和属性的情况一样,这个过程实际是在调用方法(add和remove方法)。对于一个纯
粹的事件,你所能做的事情就是订阅(添加一个事件处理程序)或者取消订阅(删除一个事件处理程序)。最终是由事件方法来做真正有用的事情,如找到你试图添加和删除的事件处理程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication16
{
delegate void DelegateTest(string str);
class Person
{
public event DelegateTest Handler;
private string name;
public string Name
{
get { return name; }
}
private string sayWords;
public string SayWords
{
get { return sayWords; }
}
public Person(string name, string saywords)
{
this.name = name;
this.sayWords = saywords;
}
public void OutPutStr(string str)
{
Console.WriteLine(str + sayWords);
}
public void TestHandle(string str)
{
Handler(str);
}
}
class staticTest
{
public static void OutPutStr(string str)
{
Console.WriteLine(str);
}
}
class Program
{
static void Main()
{
Person p1 = new Person("Li", "Hello");
DelegateTest dt = p1.OutPutStr;
dt(p1.SayWords);
DelegateTest dt2 = staticTest.OutPutStr;
dt2("hello");
DelegateTest d3 = dt + dt2;
d3("hello");
DelegateTest d4 = d3 - dt;
d4("hello");
p1.Handler += staticTest.OutPutStr;
p1.TestHandle("event");
Console.Read();
}
}
}