艾伟_转载:对ArrayList中的自定义类型进行搜索

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

一般情况下我只需要使用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();        
 }

目录
相关文章
|
6月前
|
存储 Java
百度搜索:蓝易云【Java语言之float、double内存存储方式】
由于使用IEEE 754标准进行存储,float和double类型可以表示非常大或非常小的浮点数,并且具有一定的精度。然而,由于浮点数的特性,它们在进行精确计算时可能会存在舍入误差。在编写Java程序时,需要注意使
96 0
|
6月前
|
存储 数据处理 数据安全/隐私保护
百度搜索:蓝易云【Python语言中while循环的应用举例】
以上是一些使用while循环的常见应用举例。通过while循环,你可以实现重复执行特定代码块的逻辑,直到满足退出条件。
73 0
|
12月前
|
存储 算法 Java
百度搜索:蓝易云【如何Java中的大量的if else判断?】
以上是一些常用的优化技术,可以帮助简化代码并提高可维护性。根据具体的需求和情况,选择合适的优化方法来减少大量的if-else判断。
62 0
|
XML JSON 缓存
Java实现根据关键词搜索抖音视频数据方法
Java实现根据关键词搜索抖音视频数据方法
|
分布式计算 Java Hadoop
白话Elasticsearch07- 深度探秘搜索技术之基于term+bool实现的multiword搜索底层剖析
白话Elasticsearch07- 深度探秘搜索技术之基于term+bool实现的multiword搜索底层剖析
78 0
你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅
背景 是的,如果你想搜索 List 集合,在 Java 8 之前可以使用自身的 contains/ indexOf 方法来查找元素,但仅限是完整元素,而不能模糊搜索或者自定义搜索,这时候确实只能遍历。 但现在都 2021 年了,你还在使用传统的遍历集合的方式搜索 List 集合元素吗? 那你就太 out 了,使用 Java 8 中的 Stream 搜索元素,一行代码即可搞定,而且还真的很优雅!这篇不会介绍 Stream 基础,Stream 系列我之前写过一个专题了,不懂的关注公众号Java技术栈,然后在公众号 Java 教程菜单中阅读。
|
Python
百度搜索的高级用法
百度搜索的高级用法
2966 0
百度搜索的高级用法
你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅!
是的,如果你想搜索 List 集合,在 Java 8 之前可以使用自身的 contains/ indexOf 方法来查找元素,但仅限是完整元素,而不能模糊搜索或者自定义搜索,这时候确实只能遍历。
201 0
你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅!
|
自然语言处理 搜索推荐
内容搜索排序表达式的最佳实践
本文重点介绍&quot;开放搜索&quot;中的排序表达式的配置及特征性函数的应用
5217 0
内容搜索排序表达式的最佳实践