C#中委托用法

本文实例讲述了C#中委托用法。分享给大家供大家参考。具体分析如下:

对于用户要查找的条件的千变万化,我们在写条件去查找时,是不可能一下写死的,那样,如果你写好了一个类让别人用,别人需要的不是那种查询,得去找你改条件.

那么我们能否让使用这个类的人自己定义一个规则(条件),直接传条件给你,你帮我查询出结果来,C#就可以用委托来解决,相应的java可以用接口来实现

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace FinderTest
{
  //性别枚举
  public enum Genders
  {
    male=1,female=2
  }
  //学生类
  public class Student
  {
    public Student()
    { }
    public Student(int _id, string _name, Genders _gender, DateTime _birthday, string _telephone)
    {
      this._id = _id;//学生id
      this._name = _name;//学生姓名
      this._gender = _gender;//学生性别
      this._birthday = _birthday;//学生生日
      this._telephone = _telephone;//学生电话
    }
    int _id;
    public int Id
    {
      get { return _id; }
      set { _id = value; }
    }
    string _name;
    public string Name
    {
      get { return _name; }
      set { _name = value; }
    }
    Genders _gender;
    public Genders Gender
    {
      get { return _gender; }
      set { _gender = value; }
    }
    DateTime _birthday;
    public DateTime Birthday
    {
      get { return _birthday; }
      set { _birthday = value; }
    }
    private string _telephone;
    public string Telephone
    {
      get { return _telephone; }
      set { _telephone = value; }
    }
    public void show()
    {
      Console.WriteLine(string.Format("我的姓名:{0}/t学号:{1}/t性别:{2}",_name,_id,_gender));
    }
  }
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace FinderTest
{
  //学期枚举
  public enum Semesters
  {
    x1 = 1, x2 = 2, x3 = 3
  }
  public delegate bool Predicate(Student s);//定义一个委托
  //班级类
  public class Class : ArrayList
  {
    public Class()
    { }
    public Class(string _name, string _master, Semesters _semester)
    {
      this._name = _name;
      this._master = _master;
      this._semester = _semester;
      _allStudents = new ArrayList();
    }
    private string _name;//班级名字
    public string Name
    {
      get { return _name; }
      set { _name = value; }
    }
    private string _master;//班长
    public string Master
    {
      get { return _master; }
      set { _master = value; }
    }
    private Semesters _semester;//学期
    public Semesters Semester
    {
      get { return _semester; }
      set { _semester = value; }
    }
    //班级里的学生集合
    ArrayList _allStudents;
    public ArrayList AllStudents
    {
      get { return _allStudents; }
    }
    public ArrayList FindAll(Predicate match)
    {
      if (match == null)
      {
        return this._allStudents;
      }
      ArrayList result = new ArrayList();
      for (int i = 0; i < this._allStudents.Count; i++)
      {
        Student one = (Student)this._allStudents[i];
        if (match(one))
        {
          result.Add(one);
        }
      }
      return result;
    }
  }
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace FinderTest
{
  class Program
  {
    static void Main(string[] args)
    {
      Class c1 = new Class("0603", "jsp", Semesters.x1);
      Student s1 = new Student(1, "zs", Genders.male, DateTime.Parse("1988-02-23"), "13088522635");
      Student s2 = new Student(2, "ls", Genders.female, DateTime.Parse("1986-12-03"), "13188522888");
      Student s3 = new Student(3, "ww", Genders.female, DateTime.Parse("1988-11-15"), "13288576885");
      Student s4 = new Student(4, "zl", Genders.male, DateTime.Parse("1984-02-21"), "13388534635");
      Student s5 = new Student(5, "qq", Genders.female, DateTime.Parse("1988-02-23"), "13488524335");
      Student s6 = new Student(6, "cb", Genders.male, DateTime.Parse("1989-02-23"), "13588527636");
      c1.AllStudents.Add(s1);
      c1.AllStudents.Add(s2);
      c1.AllStudents.Add(s3);
      c1.AllStudents.Add(s4);
      c1.AllStudents.Add(s5);
      c1.AllStudents.Add(s6);
      ArrayList list= c1.FindAll(match);
      //查找班级女生的资料
      //  ArrayList list = c1.FindAll(match1);
      //查找学号从1到5的学生
      foreach (Student s in list)
      {
        s.show();
      }
    }
    //条件为女性
    public static bool match(Student s)
    {
      if (s.Gender.Equals(Genders.female))
      {
        return true;
      }
      return false;
    }
    //条件为学号从1到5
    public static bool match1(Student s)
    {
      if (s.Id.CompareTo(1) >= 0 && s.Id.CompareTo(5) <= 0)
      {
        return true;
      }
      return false;
    }
  }
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • 详解C#中通过委托来实现回调函数功能的方法

    委托(delegate)是一种可以把引用存储为函数的类型,这类似于c++中的函数指针. 回调函数 c++中的回调函数,就是用函数指针来实现的.类似的,c#中用委托,来实现回调函数的功能. 回调函数为什么被称为回调函数?比如你调用了一个函数,那么就叫调用,但是如果你在调用一个函数的时候,还需要把一个函数提供给该函数,让这个函数来调用你的函数,那么你提供的这个函数就被称为回调函数(callback). 对于python这样的动态语言而言,就没有c#,c++提供特殊的语法实现回调函数,因为在pytho

  • C#异步委托调用实例分析

    本文实例讲述了C#异步委托调用实现方法.分享给大家供大家参考.具体如下: static void Main(string[] args) { //委托异步 Action<string> showMessage = ShowMessage; IAsyncResult result = showMessage.BeginInvoke("测试异步委托",null, null); //那在异步线程未完成工作以前主线程将处于阻塞状态 //等到异步线程结束,主线程才能继续工作 show

  • C#基于委托实现多线程之间操作的方法

    本文实例讲述了C#基于委托实现多线程之间操作的方法.分享给大家供大家参考,具体如下: 有的时候我们要起多个线程,更多的时候可能会有某个线程会去操作其他线程里的属性. 但是线程是并发的,一般的调用是无法实现我们的要求的. 于是,我们在这里就可以用委托,代码如下 private delegate void DelegateInfo(); private delegate void DelegateIsEnd(); //这个是线程调用其他线程的方法 private void Dowork() { //

  • C#中异步回调函数用法实例

    本文实例讲述了C#中异步回调函数用法.分享给大家供大家参考.具体如下: static void Main(string[] args) { Func<string,string> showMessage = ShowMessage; //设置了回调函数Completed,不能有返回值 IAsyncResult result = showMessage.BeginInvoke("测试异步委托",new AsyncCallback(Completed),null); //半段异

  • C#中使用委托的3种方式代码示例

    using System; namespace DelegateDemo { class Program { private delegate int Cacu(string str); static void Main(string[] args) { //1 Cacu cacu = new Cacu(CacuInstance); Console.WriteLine(cacu("Hello,Wrold")); //2 Cacu cacu1 = new Cacu(delegate(st

  • C#用匿名方法定义委托的实现方法

    本文实例讲述了C#用匿名方法定义委托的实现方法.分享给大家供大家参考.具体实现方法如下: //用匿名方法定义委托 class Program { delegate string MyDelagate(string val); static void Main(string[] args) { string str1 = " 匿名方法外部 "; //中括号部分定义来了一个方法,没有名称,编译器会定指定一个名称 MyDelagate my = delegate(string param)

  • C#通过委托调用Button单击事件的方法

    这里介绍通过委托取消Button事件switch-case的方法.需要注意的是,事先要按顺序在各个Button的Tag属性中设置0.1.2.3--等序号,其作用请详看代码. /*定义委托*/ public delegate 类型或viod MethodDelegate(参数1, 参数2); private void buttonC_Click(object sender, EventArgs e) { Button button = (Button)sender; /*向委托添加方法*/ Met

  • C#中委托用法实例详解

    本文实例讲述了C#中委托用法.分享给大家供大家参考.具体分析如下: 这里演示了如何使用匿名委托来计算员工的薪水奖金.使用匿名委托简化了程序,因为无需再定义一个单独的方法. (-:The data for each employee is stored in an object containing personal details as well as a delegate that references the algorithm required to calculate the bonus

  • C#泛型委托的用法实例分析

    本文实例讲述了C#泛型委托的用法.分享给大家供大家参考.具体分析如下: 冒泡排序大家都知道,例如一个整形数组,可以用冒泡排序来使它按从小到大的顺序排序, 但它仅限于了按整形数组来排序,如何做到按任意类型进行排序呢,例如按一个类的某个属性进行排序? 举例说明:定义一组以类MEmployee为元素的数组,按MEmployee的Salary属性进行排序,类似的可以引伸为对其他类型的比较 元素类定义: public class MEmployee { public string Name { get;

  • C#使用委托(delegate)实现在两个form之间传递数据的方法

    本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法.分享给大家供大家参考.具体分析如下: 关于Delegate[代理.委托]是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名方法.lambda表达式. 现在我就从一个最简单最实用的一个小例子出发分析一下Delegate的使用. 现在有两个窗体Form1和Form2. 两个按钮Button1(Form)和Button2(Form2). Form1的代码: private void button

随机推荐