public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
private void button1_Click(object sender, EventArgs e) //利用谓词实现List<>的Find查询
{
List<Person> ListPerson = new List<Person>();
ListPerson.Add(new Person() { Name = "刘备" }); //注意这用new对象的赋值方法,没有参数的构造函数也能在创建同时就赋值
ListPerson.Add(new Person() { Name = "关羽" });
ListPerson.Add(new Person() { Name = "张飞" });
ListPerson.Add(new Person() { Name = "汉献帝" });
//一、Contain的注意,如果是引用类型,只能比较同地址的应用,不能比较值完全相同的元素
//虽然p1与ListPerson[1]完全一样,但由于Person是引用类型,所以ListPerson.Contains(p1)=false,而ListPerson.Contains(ListPerson[1])=true;
Person p1 = new Person() { Name = "关羽" };
p1 = ListPerson[1];
bool ct = ListPerson.Contains(p1);
//但是,如果Person不是类Class而是结构Struct,则变为值类型,上面两种写法都返回True
//Class和Struct还有几点区别
//1、struct不能包含不带参数的构造函数,但可以没有构造函数,在没有构造函数情况下,Person p1 = new Person() { Name = "关羽" };仍然可以
//2、struct中对象中的某一属性不能单独修改,只能整个对象一起替换,如不能写ListPerson[0].Name=="吕布",但是可以写ListPerson[0] = new Person() { Name = "吕布");
//二、谓词实现高级功能
//谓词就是形如List.Find(Predicate<T> match); 括号里的就是谓词,它可以是一个委托函数或是一个拉姆表达式
Person pc = ListPerson.Find(m => m.Name == "刘备"); //括号里的就是拉姆表达式,m代表ListPerson中的一个对象,
//=>后跟一个逻辑表达式。List中每一个元素都与该逻辑表达式匹配,如果对该元素表达式成立,则选中。对Find函数而言,返回第一个选中的元素。
//稍微复杂一点的拉姆表达式,返回汉献帝
pc = ListPerson.Find(m =>
{
if (m.Name.Length > 2)
return true;
return false;
});
//也可以用委托函数的方式实现谓词,语法为:
pc = ListPerson.Find(ListFind);
//Find返回第一个满足条件的元素,返回类型与List<>中的元素相同
//FindAll返回所有满足条件的元素,返回类型也是List<>,相当于返回子集
//FindLast返回最后一个匹配的元素
//TrueForAll,如果所有元素都满足条件,返回true,否则false,可用于验证
//Where与FindAll类似,只不过返回值IEnumerable,要ToList()一下才能返回List<>。例如List<Person> ListPerson2 = ListPerson.Where(m => m.Name != "刘备").ToList();
//RemoveAll剔除所有满足条件的元素
}
public bool ListFind(Person p) //委托函数的参数必须与待查找元素相同的类型,返回类型也必须的bool型
{
if (p.Name.Length > 2)
return true;
return false;
}