艾伟_转载:对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();
 }
时间: 2024-10-23 15:17:37

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

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

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

艾伟_转载:ASP.NET中写自定义的Config Provider

一.写作前题     我们用ASP.NET做项目开发的时候,配置Config文件那是经常的事情,VS.NET的Config文件提供了很多节,但是往往提供的这些配置信息还不能够完全满足我们的项目开发需求,而且微软正是考虑到这方面的因素,他允许用户自定义Configuration的相关配置内容.本文就此写了一些实例,希望对大家有所帮助.   二.本文内容   1.实现web.config中的自定义2.对自定义节的使用3.本文总结 三.实现Web.Config中自定义节     废话不多说,直接说主题

艾伟_转载:数组排序方法的性能比较(中):Array.Sort&lt;T&gt; 实现分析

昨天我们比较了Array.Sort方法与LINQ排序的性能,知道了LINQ排序的性能以较大幅度落后于Array.Sort方法.而对于Array.Sort来说,性能最高的是其中使用Comparer.Default作为比较器的重载方法.在前文的末尾我们做出了推测:由于排序算法已经近乎一个标准了(快速排序),因此从算法角度来说,Array.Sort方法和LINQ排序上不应该有那么大的差距,因此造成两者性能差异的原因,应该是具体实现方式上的问题. 下载.NET框架的代码 既然是比较实现的区别,那么阅读代

艾伟_转载:.NET 4.0中数组的新增功能

1.两数组是否"相等"? 在实际开发中,有时我们需要比对两个数组是否拥有一致的元素,例如,以下两个数组由于拥有相同的元素,因此被认为是相等的: int[] arr1 = new int[]{1,2,3,4};int[] arr2 = new int[]{1,2,3,4}; 在.NET早期版本中,要实现上述数组比对功能,必须自己动手编写一个函数,在其内部使用循环语句逐个比较两个数组的对应元素,才知道这两个数组是否相等. 在.NET 4.0中,数组基类Array实现了一个新增的接口IStr

艾伟_转载:使用配置文件(.settings、.config)存储应用程序配置

引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格式的序列化来保存应用程序配置.这样每次都要建立单独的配置类,并书写读写配置代码,相当麻烦. 期间也看了看.config文件的读写方式,感觉还是很麻烦,不如自己序列化来的踏实. 后来才猛然发现微软早提供好了settings,用以定义.config文件内容,并生成相应的强类型类,使用起来极其方便~,感觉就像在火星居住了半辈子突然发现还有地球这好地方*_*~ 鉴于网上setti

艾伟_转载:WCF基本异常处理模式[中篇]

通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端:如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送. 这两种方式体

艾伟_转载:C# WinForm开发系列 - TextBox

包含金额/日期输入框,带弹出数字面板的计算输入框,安全密码输入等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ).   1.CalculatorBox    CalculatorBox.rar 2.带行号+自定义颜色显示的TextBox 3.金额输入框   currency_textbox.zip   CurrencyBox.rar   NumberPicker_src.zip   NumericTextBox_src.zip   NumberedTextbox.rar 4.日

艾伟_转载:Lucene.net多字段多索引目录搜索

Lucene.net是目前在.net环境中被普遍使用的全文索引的开源项目,这次在项目的开发中也使用它进行全文索引.在开发过程中碰到一些小问题就是对多字段和多索引目录进行搜索. 1.多字段搜索就是同时要一个以上的字段中的内容进行比较搜索,类似概念在SQL中就是select * from Table where a like '%query%' or b like '%query%'. Lucene.net中的单个字段查询大家都比较熟悉,这里对字段content进行搜索 Query query =

艾伟_转载:.NET Discovery 系列之六--Me JIT(下)

本系列文章导航 .NET Discovery 系列之一--string从入门到精通(上) .NET Discovery 系列之二--string从入门到精通(勘误版下) .NET Discovery 系列之三--深入理解.NET垃圾收集机制(上) .NET Discovery 系列之四--深入理解.NET垃圾收集机制(下) .Net Discovery 系列之五--Me JIT(上) .NET Discovery 系列之六--Me JIT(下) .NET Discovery 系列之七--深入理解