自己定义泛型集合并实现foreach遍历

1.首先创建一下SelfList<T>类;

  public class SelfList<T>:IEnumerable

  {
 

  }

2.添加默认的初始大小为4的Item数组;

  

public class SelfList<T>:IEnumerable

{
 /// <summary>
  /// 默认数组
  ///
</summary>
  private T[] items=new T[4];
  public T[]
Items
  {
    get { return items; }
    set { items = value;
}
  }

}

3.添加只读的Count属性,用于记录Item数组中元素的个数

public class SelfList<T>:IEnumerable

{
  /// <summary>
  /// 默认数组
  ///
</summary>
  private T[] items=new T[4];
  public T[]
Items
  {
    get { return items; }
    set { items = value;
}
  }

  /// <summary>
  /// 记录数组中元素的个数
  ///
</summary>
  private int count;
  public int Count
  {
    get
{ return count; }
  }

}

4.添加向数组中增加元素的方法

/// <summary>
/// 向数组中添加元素
/// </summary>

/// <param name="item"></param>
public void Add(T
item)
{
  if (count==items.Length)
  {
    T[] newArr=new
T[items.Length*2];
    items.CopyTo(newArr,0);
    items =
newArr;
  }
  items[count] = item;
  count++;
}

5.添加删除元素的方法

  public void RemoveAt(int index)
  {
    if (index < 0 || index
>= items.Length)
    {
      throw new
Exception("下标越界");
    }
    Array.Copy(items,index+1,items,index,items.Length-index-1);
    count--;
  }

6.添加索引

  public T this[int index]
  {
    get
    {
      if (index <
0 || index>=items.Length)
    {
      throw new
Exception("下标越界");
    }
    return
items[index];
  }
  set
  {
    if (index < 0 || index >=
items.Length)
    {
      throw new
Exception("下标越界");
    }
    items[index] = value;
    }
  }

7.要实现对集合的遍历需要实现 IEnumerable接口并重写 GetEnumerator()方法,方法有一个IEnumerator接口的返回值,所以我们要自己定义一个实现了IEnumerator

接口的类

public class SelfList<T>:IEnumerable

{

  public IEnumerator GetEnumerator()
  {
    return new
MyEnumerator<T>(items,count);
  }

}

public class MyEnumerator<T> : IEnumerator
{

  private T[] temp;//记录要遍历的数组
  private int num;//记录数组中元素的个数

  private int index = -1;
  public MyEnumerator(T[] temp,int
num)
  {
    this.temp = temp;
    this.num = num;
  }

  /// <summary>
  /// 得到现在下标指向的元素
  ///
</summary>

  public object Current
  {
    get { return temp[index]; }
  } 

  /// <summary>
  /// 判断下一个位置是否还有元素
  ///
</summary>
  /// <returns></returns>

  public bool MoveNext()
  {
    index++;
    if
(index<num)
    {
      return true;
    }
    return
false;
  }  

  /// <summary>
  /// 初始化遍历位置
  /// </summary>

  public void Reset()
  {
    index = -1;
  }

}

8.最后在Main方法中就可以实现集合的遍历:

static void Main(string[] args)
{  

  SelfList<int> lists=new SelfList<int>();

  lists.Add(1);
  lists.Add(2);
  lists.Add(3);

  foreach(int item in lists)

  {

    Console.WriteLine(item+"");

  }

}

自定义集合的全部实现代码:

public class SelfList<T>:IEnumerable
{
  ///
<summary>
  /// 默认数组
  /// </summary>
  private T[]
items=new T[4];
  public T[] Items
  {
    get { return items;
}
    set { items = value; }
  }
  /// <summary>
  ///
记录数组中元素的个数
  /// </summary>
  private int count;
  public
int Count
  {
    get { return count; }
  }
  ///
<summary>
  /// 向数组中添加元素
  /// </summary>
  ///
<param name="item"></param>
  public void Add(T
item)
  {
    f (count==items.Length)
    {
      T[] newArr=new
T[items.Length*2];
      items.CopyTo(newArr,0);
      items =
newArr;
    }
    items[count] = item;
    count++;
  }

  /// <summary>
  /// 数组下标索引
  ///
</summary>
  /// <param name="index"></param>
  ///
<returns></returns>
  public T this[int
index]
  {
    get
    {
      if (index < 0 ||
index>=items.Length)
    {
      throw new
Exception("下标越界");
    }
    return
items[index];
  }
  set
  {
    if (index < 0 || index >=
items.Length)
    {
      throw new
Exception("下标越界");
    }
    items[index] =
value;
    }
  }
  /// <summary>
  ///
  ///
</summary>
  /// <param name="index"></param>
  public
void RemoveAt(int index)
  {
    if (index < 0 || index >=
items.Length)
    {
      throw new
Exception("下标越界");
    }
    Array.Copy(items,index+1,items,index,items.Length-index-1);
    count--;
  }

  public IEnumerator GetEnumerator()
  {
    return new
MyEnumerator<T>(items,count);
  }
}

时间: 2024-10-11 07:48:15

自己定义泛型集合并实现foreach遍历的相关文章

ConvertHelper与泛型集合

在机房重构时,我们经常会用到ConvertHelper.它把从数据库中查询到的dateTable(也是一个临时表)转化为泛型,然后再填充到DataGridView控件中.ConvertHelper类有两点体现了面向对象的思想.一是因为它是经常被使用而被封装起来的类:二是因为它的返回值是泛型集合,泛型集合使存储数据时灵活而安全,也体现了面向对象的思想. ConvertHelper与sqlHelper 一开始接触ConvertHelper,以为它和sqlHelper一样,后来发现它们因为作用不同引用

C#泛型集合List&lt;T&gt;用法总结

List<T>在C#应用程序中是一种快捷.易于使用的泛型集合类型,使用泛型编程为编写面向对象程序增加了极大的效率和灵活性,不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换. 补充说明: 在决定使用IList<T> 还是使用ArrayList类(两者具有类似的功能)时,记住IList<T> 类在大多数情况下执行得更好并且是类型安全的. 如果对IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的.但是,如果对类型 T 使用值类

机房收费系统重构(六)—泛型集合

      机房收费系统重构仍在进行,但是在进行过程中,也许数据类型的转换是永远也避不开的,今天我就来讲讲关于数据类型转换的问题!       在个人版机房收费系统中,在DAL层中,如果是增删改,是不需要返回参数的,返回值是Boolean,但是在查询中,需要有返回值,而且返回的是Dateset类型,所以在这里问题就来了.      如果在返回值过程中一直返回的是表的类型,也许就没有那么多麻烦的事情了,但是dateset使得系统具有了强耦合性,但是如果返回的是实体类呢!关于这点我也查了查资料,为什

vb.net机房收费 &amp; 泛型集合-实现文本框显示记录

     做基本数据设定窗体,本以为实现这个小小的窗体应该是最简单的吧!不就是单击修改按钮,进行修改:然后单击更新按钮来对数据基本设定进行更新吗?可是当一出手就遇到了问题,数据表中的数据该怎么显示在文本框中呢?这真的一下子难住了自己!不过遇到问题总会有解决的办法. 既然是让实体一个一个返回到文本框中来,那么直接调用实体层应该就可以吧!这样不就可以完美的实现了吗?可是这样最大的缺点则是:以后遇到的控件与数据调用的窗体比比即是,这样不就又重蹈覆辙实现了代码的重复吗?很严重的违背了为了把重复的部分提取

迭代器、foreach循环、泛型集合

集合的迭代 语法:Iterator<Object> it=集合.iterator(); while(it.hasNext()){ Object obj=it.next(); } is.hasNext(); //判断是否有下一个元素 it.next(); //移动指针,返回指针指向元素 注意:集合在遍历的过程中不能进行修改,如果进行了修改操作,那么就会抛出ConcurrentModificationException异常, 如果需要进行删除,使用迭代器的it.remove()方法 foreach

自己写一个泛型集合类型,可实现添加和遍历

在"C#中List<T>是怎么存放元素的"中,分析了List<T>的源码,了解了List<T>是如何存放元素的.这次,就自定义一个泛型集合类型,可实现添加元素,并支持遍历. 该泛型集合类型一定需要一个添加元素的方法,在添加元素的时候需要考虑:当添加的元素超过当前数组的容量,就让数组扩容:为了支持循环遍历,该泛型集合类型必须提供一个迭代器(实现IEnumerator接口). public class MyList<T> { T[] item

用&lt;forEach&gt;遍历list集合时,提示我找不到对象的属性

<c:forEach items="${list}" var="item"> <tr> <td>${item.UserId}</td> <td>${item.UserName}</td> </tr> </c:forEach> 用<forEach>遍历list集合时,提示我找不到对象的属性.因为他封装的时候 他会主动将第一位改成大写 如果你的是 name 封装好

使用yield关键字让自定义集合实现foreach遍历

一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代器方法来实现foreach的遍历,且自定义的集合不用实现IEnumerable接口 注:虽然不用实现IEnumerable接口 ,但是迭代器的方法必须命名为GetEnumerator() ,返回值也必须是IEnumerator类型 实例代码以及简单说明如下: 1 class Person 2 { 3

DataSet装换为泛型集合 222

#region DataSet装换为泛型集合 /// <summary> /// 利用反射和泛型 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ConvertToList<T>(DataTable dt) { // 定义集合 List<T> ts