集合的筛选
经常在项目中遇到要删除集合中某些元素,而用foreach遍历集合时,不能在遍历集合时直接移除要移除的元素,
在这里总结了集合筛选的方法:
static void Main(string[] args) { List<Person> personList = new List<Person> { new Person{Name="张三",Gender="男",Age=19}, new Person{Name="李四",Gender="男",Age=34}, new Person{Name="春丽",Gender="女",Age=20}, new Person{Name="老王",Gender="男",Age=37}, new Person{Name="小红",Gender="女",Age=18}, }; //移除年龄大于25,且性别为男的person //方法一:linq 扩展方法where() //personList = personList.Where(p=>p.Gender=="男"&&p.Age>25).ToList(); #region 方法二:遍历集合找到所有要移除的元素,装到一个临时集合里,然后取两个集合的差集 List<Person> personList2 = new List<Person>(); foreach (Person p in personList) { if (p.Gender == "男"&&p.Age >25) { personList2.Add(p);//装到临时集合里 } } //取两个集合的差集 personList = personList.Except(personList2).ToList();//因为是延迟查询,所有ToList()一下赋值给原集合,原集合即为筛选后的集合 //输出 foreach (Person p in personList) { Console.WriteLine(p.Name+" "+p.Gender+" "+p.Age); } Console.ReadKey(); } } #endregion
public class Person { private string namr; public string Name { get { return namr; } set { namr = value; } } private string gender; public string Gender { get { return gender; } set { gender = value; } } private int age; public int Age { get { return age; } set { age = value; } } }
总结:推荐第一种写法:扩展方法(lambda表达式),代码简洁,一气呵成。