C# 在列表中按特性查找
2013-08-24 11:34
190 查看
声明:阅读本文需要 C# 泛型和委托的基本知识。
大家好!
列表在编程过程中应用极为广泛,而按照索引来查找显然不能满足所有需求, C#.NET 提供了很好的内建方法来方便程序员编写按照特性来搜索列表中的成员的代码。
下面我将介绍该方法。
在 List 类中,有几个方 :FindIndex 、 FindAll、Find、FindIndexLast、FindLast 。
FindIndex 方法的参数是一个委托,该委托是 Predicate<T> 类型的,接受一个 T 类型的参数,返回一个布尔值。其他方法的参数也是如此。
Predicate<T> 的定义如下:
方法签名如下:
这几个方法会将列表中的每一项作为参数,传递给该委托。 FindIndex 会返回第一个在委托中返回布尔值的对象的索引,并停止查找;FindAll 则会一直查找到结束为止,并返回一个 T 类型的列表;Find 则会返回第一个符合条件的T 类型的对象,并结束查找;FindIndexLast 和 FindLast 是从后向前查找,功能分别和 FindIndex 及 Find 对应。
下面用一个示例来说明(由于这几个函数用法都一样,只是返回类型不同,就只拿 FindIndex 和 FindAll 来说明):
运行结果如下:
谢谢阅读!
Rember !You Make Luck !
大家好!
列表在编程过程中应用极为广泛,而按照索引来查找显然不能满足所有需求, C#.NET 提供了很好的内建方法来方便程序员编写按照特性来搜索列表中的成员的代码。
下面我将介绍该方法。
在 List 类中,有几个方 :FindIndex 、 FindAll、Find、FindIndexLast、FindLast 。
FindIndex 方法的参数是一个委托,该委托是 Predicate<T> 类型的,接受一个 T 类型的参数,返回一个布尔值。其他方法的参数也是如此。
Predicate<T> 的定义如下:
public delegate bool Predicate<T>(T object)
方法签名如下:
public int FindIndex(Predicate<T> func)
这几个方法会将列表中的每一项作为参数,传递给该委托。 FindIndex 会返回第一个在委托中返回布尔值的对象的索引,并停止查找;FindAll 则会一直查找到结束为止,并返回一个 T 类型的列表;Find 则会返回第一个符合条件的T 类型的对象,并结束查找;FindIndexLast 和 FindLast 是从后向前查找,功能分别和 FindIndex 及 Find 对应。
下面用一个示例来说明(由于这几个函数用法都一样,只是返回类型不同,就只拿 FindIndex 和 FindAll 来说明):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FindFeature { //定义球队类 class FootballTeam { private String name; //球队名 private int winnerCount; //冠军次数 private int level; //等级 public String Name { get; set; } public int WinnerCount { get; set; } public int Level { get; set; } //3个参数的构造函数 public FootballTeam(String name, int winnerCount, int level) { this.Name = name; this.WinnerCount = winnerCount; this.Level = level; } //1个参数的构造函数 public FootballTeam(String name) { this.Name = name; } //按照球队名查找 public bool FindName(FootballTeam footballTeam) { if (this.Name == footballTeam.Name) { return true; } else { return false; } } //按照夺冠次数查找 public static bool FindWinnerCount(FootballTeam footballTeam) { if (footballTeam.WinnerCount > 0) { return true; } else { return false; } } } class Program { static void Main(string[] args) { //构建列表并向其中添加4个成员 List<FootballTeam> teams = new List<FootballTeam>(); teams.Add(new FootballTeam("A", 3, 1)); teams.Add(new FootballTeam("B", 4, 1)); teams.Add(new FootballTeam("C", 2, 2)); teams.Add(new FootballTeam("D", 4, 2)); teams.Add(new FootballTeam("E", 0, 1)); //查找球队名为 "B" 的对象 int ind = teams.FindIndex(new FootballTeam("B").FindName); //也可以使用lambda表达式(lambda 表达式本文不赘述),代码如下: //int ind = teams.FindIndex(r => r.Name == "B"); Console.WriteLine(teams[ind].Name); Console.WriteLine(); //查找球队夺冠次数大于0的对象,并返回一个列表 List<FootballTeam> winners = new List<FootballTeam>(); winners = teams.FindAll(FootballTeam.FindWinnerCount); //也可以使用lambda表达式,代码如下: //winners = teams.FindAll(r => r.WinnerCount > 0); winners.ForEach(r => Console.WriteLine("{0} winner counts:{1}",r.Name,r.WinnerCount)); Console.ReadKey(); } } }
运行结果如下:
谢谢阅读!
Rember !You Make Luck !
相关文章推荐
- C#查找列表中所有重复出现元素的方法
- C# 查找两个列表之间的差集(LINQ)
- C#查找列表中所有重复出现元素代码
- C#实现图像轮廓的查找、表达、绘制、特性及匹配
- C#实现图像轮廓的查找、表达、绘制、特性及匹配
- C# 使用‘反射(Assembly)’查找具有指定‘特性(Attributes) ’的类
- C# 使用‘反射(Assembly)’查找具有指定‘特性(Attributes) ’的类
- 轮廓的查找、表达、绘制、特性及匹配 c#版
- C# 6和 VB 12的最新特性列表
- C# 6和 VB 12的最新特性列表
- C# 查找指定文件夹下 指定后缀名的所有文件(文件列表)
- C#和VB新版本的最新特性列表
- C# 枚举特性 FlagAttribute 的应用
- C#中怎么获取comboBox下拉列表选中项的Tag值
- c#通过反射查找接口的实现 并创造实例
- (转)C# 特性(Attribute)详细介绍
- C# 4.0四大新特性代码示例与解读
- 开发者最希望看到的C# 4.0新特性,徐汇区网站设计
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- c# 4.0(vs2010)新特性一览