天天看点

C# 在列表中按特性查找

声明:阅读本文需要 C# 泛型和委托的基本知识。

大家好!

列表在编程过程中应用极为广泛,而按照索引来查找显然不能满足所有需求, 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();
        }
    }
}
           

运行结果如下:

C# 在列表中按特性查找

谢谢阅读!

Rember !You Make Luck !