C#:iterator 迭代器/partial class 分布类/泛型_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#:iterator 迭代器/partial class 分布类/泛型

C#:iterator 迭代器/partial class 分布类/泛型

 2013/8/19 15:29:38  李晓峰  博客园  我要评论(0)
  • 摘要:iterator迭代器概述迭代器是可以返回相同类型的值的有序序列的一段代码。迭代器可用作方法、运算符或get访问器的代码体。迭代器代码使用yieldreturn语句依次返回每个元素。yieldbreak将终止迭代。可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在foreach语句中被客户端代码调用,如下所示:foreach(intxinSampleClass.Iterator2){}迭代器的返回类型必须为IEnumerable、IEnumerator
  • 标签:C# 泛型 class

class="heading">iterator 迭代器概述

  • 迭代器是可以返回相同类型的值的有序序列的一段代码。

  • 迭代器可用作方法、运算符或 get 访问器的代码体。

  • 迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。

  • 可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}

  • 迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。

yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。

写个最简单的迭代,(迭代一个字符串数组):

1.实现接口中的方法:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Collections;   //动态数组是在这个命名空间下的,所以使用前要包含
 7 
 8 namespace ConsoleApplication1
 9 {
10     //interator_class是继承IEnumerable接口的类
11     class interator_class:System.Collections.IEnumerable 
12     {
13         //写一个要迭代的字符串数组
14         ArrayList al = new ArrayList() {"大家好!","我是李晓峰","希望大家多多指教!","谢谢" };
15 
16         //实现GETEnumerator()该方法
17         public System.Collections.IEnumerator GetEnumerator()    
18         {
19             for (int i = 0; i < 4; i++)
20             { yield return al[i]; }       //返回
21         }
22     }
23 }

2.调用:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication1
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             //实例化interator_class类
14             interator_class ic = new interator_class();  
15 
16             //迭代
17             foreach (string al_ary in ic)
18             {
19                 Console.WriteLine(al_ary+"\n");
20             }
21 
22             //聚焦显示
23             Console.ReadLine();
24         }
25     }
26 }

3.运行:

 

partial class 分布类:

      简单说就是将一个类在一个命名空间内解剖开:

例如:写一个partial类,每个class中分布一个方法():

1.分布类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace WindowsFormsApplication1
 8 {
 9    //写4个分布类,每个类中分别写了一个运算方法:
10 
11    public partial  class jisuan_fangfa
12     {
13        public int jiafa(int a,int b)
14        { return a + b; }
15     }
16 
17    public partial class jisuan_fangfa
18    {
19        public int jianfa(int a, int b)
20        { return a - b; }
21    }
22 
23    public partial class jisuan_fangfa
24    {
25        public int chengfa(int a, int b)
26        { return a * b; }
27    }
28 
29 
30    public partial class jisuan_fangfa
31    {
32        public int chufa(int a, int b)
33        { return a /b; }
34    }
35 }

2.调用:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 
11 namespace WindowsFormsApplication1
12 {
13     public partial class Form6 : Form
14     {
15         public Form6()
16         {
17             InitializeComponent();
18         }
19 
20         private void Form6_Load(object sender, EventArgs e)
21         {
22             //默认回车键为 计算;
23             AcceptButton = button1;
24 
25             //向combobox内添加选项;
26             comboBox1.Items.Add(""); comboBox1.Items.Add("");
27             comboBox1.Items.Add(""); comboBox1.Items.Add("");
28 
29             //combobox默认选择 加法
30             comboBox1.SelectedIndex = 0;
31 
32             this.toolStripStatusLabel1.Text = "欢迎使用!";
33 
34         }
35 
36         private void button1_Click(object sender, EventArgs e)
37         {
38             if (textBox1.Text == string.Empty || textBox2.Text == string.Empty)
39             {
40                 MessageBox.Show("请输入要运算的数据!");
41 
42                 //提示输入信息:
43                 if (textBox1.Text == string.Empty)
44                 { errorProvider1.SetError(textBox1, "这里不能为空!"); }
45                 if (textBox2.Text == string.Empty)
46                 { errorProvider1.SetError(textBox2, "这里不能为空!"); }
47             }
48             else
49             {
50                 //实例化类
51                 jisuan_fangfa jisuan = new jisuan_fangfa();
52 
53                 switch (comboBox1.Text.Trim())   //判断combobox中选择计算的模式
54                 {
55                         //数据的转换/判断
56                     case "": textBox3.Text=jisuan.jiafa(Convert.ToInt32(textBox1.Text.Trim()),Convert.ToInt32(textBox2.Text.Trim())).ToString(); break;
57                     case "": textBox3.Text = jisuan.jianfa(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString(); break;
58                     case "": textBox3.Text = jisuan.chengfa(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString(); break;
59                     case "": textBox3.Text = jisuan.chufa(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString(); break;
60                 }
61 
62             }
63         }
64     }
65 }

3.实践:

DBA2DC8F2488ECA.png" alt="" />    

 

泛型:

       泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。

1.接口:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication2
 8 {
 9 public interface Interface1<T>
10     {
11     T fangfa();
12     }
13 }

2.继承泛型接口的类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication2
 8 {
 9      //Class_t类中有2个泛型,T是继承于T1,T可以实例化
10    public  class Class_t<T,T1>:Interface1 <T1 > where T:T1, new()
11     {
12        //实现该方法:
13        public T1 fangfa()
14        { return new T(); }
15       
16     }
17 }

3.实例化,调用:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication2
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             //实例化,并添加类型
14             Interface1<System.ComponentModel.IListSource> inter = new Class_t<System.Data.DataTable, System.ComponentModel.IListSource>();
15            
16             //输出inter.fangfa()的类型
17             Console.WriteLine("T是:"+inter.fangfa().GetType().ToString()+"类型");  
18             Console.ReadLine();
19         }
20     }
21 }

4.运行:

 

2.方法();

   写一个用户名和密码的验证方法:

1.方法:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication2
 8 {
 9   public   class Class1
10     {
11       public void error_show<T, T1>(T yonghuming, T1 mima)
12       {
13           if (string.Equals(yonghuming, "lixiaofeng") && string.Equals(mima.ToString(), "123"))
14           {
15               Console.WriteLine("验证成功!");
16           }
17           else
18           { Console.WriteLine("验证失败,你的输入信息有问题!"); }
19 
20           
21       }
22   
23     }
24 }

2.调用:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication2
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             int mii;  //定义密码变量
14 
15             //接受用户输入的用户名和密码
16             Console.WriteLine("请输入用户名:"); string mizi = Console.ReadLine();
17             Console.WriteLine("请输入密码:"); mii = Convert.ToInt32(Console.ReadLine());
18             
19             //实例化class1,并填入泛型类型
20             Class1 c1 = new Class1();
21             c1.error_show<string, int>(mizi, mii );
22 
23             Console.ReadLine();
24         }
25     }
26 }

3.验证:

 

水平有限,还望指教,谢谢!

 

上一篇: 唯品会的“暴涨逻辑”:以尾货清理为主打 下一篇: 没有下一篇了!
发表评论
用户名: 匿名