对ArrayList中的自定义类型进行搜索

简介:
 
 

一般情况下我只需要使用ArrayList.Contains()方法就可以判断某个元素是否存在,但如果ArrayList中的为自定义的类就需要自己实现,如下面例子:

如我们有一个类:

public class Employee
{
     public int EmployeeID
     {
            get;set;
     }

     public string EmployeeName
     {
           get;set;
     }

     public DateTime BirthDate
     {
           get; set;
     }
}

我们要实现对ArrayList中存储的Employee 进行查找。先定义两个枚举:

public enum MemType
{
    IntegerType = 1, StringType = 2, DateTimeType = 3, BooleanType = 4
};

public enum CmpOperator
{
    GreaterThan = 1, LessThan = 2, EqualTo = 3
}

下面是具体实现:

public static int Search(ArrayList objArr, string valueToSearch, string FieldName, MemType memType, CmpOperator comOp)
{
    if (memType == MemType.StringType || memType == MemType.BooleanType)
    {
        comOp = CmpOperator.EqualTo;
    }

    for (int i = 0; i < objArr.Count; i++)
    {
        Type t = objArr[0].GetType();
        System.Reflection.FieldInfo[] arrInner = t.GetFields();
        System.Reflection.PropertyInfo PI = t.GetProperty(FieldName);
        string str = PI.GetValue(objArr[i], null).ToString();
        switch (memType)
        {
            case MemType.BooleanType:
                if (Convert.ToBoolean(str) == Convert.ToBoolean(valueToSearch))
                {
                    return i;
                }
                break;
            case MemType.DateTimeType:
                switch (comOp)
                {
                    case CmpOperator.EqualTo:
                        if (Convert.ToDateTime(str).CompareTo(Convert.ToDateTime(valueToSearch)) == 0)
                        {
                            return i;
                        }
                        break;
                    case CmpOperator.GreaterThan:
                        if (Convert.ToDateTime(str).CompareTo(Convert.ToDateTime(valueToSearch)) > 0)
                        {
                            return i;
                        }
                        break;
                    case CmpOperator.LessThan:
                        if (Convert.ToDateTime(str).CompareTo(Convert.ToDateTime(valueToSearch)) < 0)
                        {
                            return i;
                        }
                        break;
                }
                break;
            case MemType.IntegerType:
                switch (comOp)
                {
                    case CmpOperator.EqualTo:
                        if (Convert.ToInt32(str) == Convert.ToInt32(valueToSearch))
                        {
                            return i;
                        }
                        break;
                    case CmpOperator.GreaterThan:
                        if (Convert.ToInt32(str) > Convert.ToInt32(valueToSearch))
                        {
                            return i;
                        }
                        break;
                    case CmpOperator.LessThan:
                        if (Convert.ToInt32(str) < Convert.ToInt32(valueToSearch))
                        {
                            return i;
                        }
                        break;
                }
                break;
            case MemType.StringType:
                if (str.Contains(valueToSearch))
                {
                    return i;
                }
                break;
        }
    }

    return -1;
}

测试代码如下:

static void Main(string[] args)
 {
     ArrayList al = new ArrayList();
     Employee emp1 = new Employee();
     emp1.EmployeeID = 2;
     emp1.EmployeeName = "cary";           
     emp1.BirthDate = new DateTime(1982, 4, 1);

     Employee emp2 = new Employee();
     emp2.EmployeeID = 3;
     emp2.EmployeeName = "james";           
     emp2.BirthDate = new DateTime(1983, 4, 1);

     al.Add(emp1);
     al.Add(emp2);

     int searIndex = Search(al, "3", "EmployeeID", MemType.IntegerType, CmpOperator.EqualTo);
     Console.WriteLine(searIndex);
     Console.ReadLine();        
 }

本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2009/11/08/Search-in-ArrayLilst.html,如需转载请自行联系原作者
相关文章
|
17天前
|
Java
list集合 使用java8同一列表获取前一条的数据放到当前对象中
list集合 使用java8同一列表获取前一条的数据放到当前对象中
|
8月前
|
存储 算法 Serverless
【100天精通python】Day7:数据结构_列表 List的创建、删除、访问、遍历、统计、排序、推导等使用
【100天精通python】Day7:数据结构_列表 List的创建、删除、访问、遍历、统计、排序、推导等使用
103 0
|
8月前
|
Java
java8 List根据对象中属性去重-多属性去重-去除重复字符串
java8 List根据对象中属性去重-多属性去重-去除重复字符串
641 0
|
10月前
|
存储 索引 Python
10.从入门到精通:Python 列表(List),列表脚本操作符,列表截取,列表函数&方法
10.从入门到精通:Python 列表(List),列表脚本操作符,列表截取,列表函数&方法
|
Linux 数据库
Linunx搜索,查找类
1.Linux find 命令 Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 按文件名查找: 例如:查找服务器上所有名为hello.txt的文件:
103 0
你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅
背景 是的,如果你想搜索 List 集合,在 Java 8 之前可以使用自身的 contains/ indexOf 方法来查找元素,但仅限是完整元素,而不能模糊搜索或者自定义搜索,这时候确实只能遍历。 但现在都 2021 年了,你还在使用传统的遍历集合的方式搜索 List 集合元素吗? 那你就太 out 了,使用 Java 8 中的 Stream 搜索元素,一行代码即可搞定,而且还真的很优雅!这篇不会介绍 Stream 基础,Stream 系列我之前写过一个专题了,不懂的关注公众号Java技术栈,然后在公众号 Java 教程菜单中阅读。
|
算法 Java
Leetcode 04——搜索插入位置(Java)
Leetcode 04——搜索插入位置(Java)
54 0
Leetcode 04——搜索插入位置(Java)
你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅!
是的,如果你想搜索 List 集合,在 Java 8 之前可以使用自身的 contains/ indexOf 方法来查找元素,但仅限是完整元素,而不能模糊搜索或者自定义搜索,这时候确实只能遍历。
162 0
你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅!
List列表按照对象进行排序
List列表按照对象进行排序
113 0