编程社区 » C#编程 » 关于枚举类和集合类的问题,高手指点下哦

关于枚举类和集合类的问题,高手指点下哦


xie_kang



 发表:

关于枚举类和集合类的问题,高手指点下哦


using System;
using System.Collections;

namespace CS.Enumerator
{
public class AssociativeArray: IEnumerable
{
// Event delegate
public delegate void ChangeEventHandler(object sender, EventArgs e);
// Create an array and specify its initial size.
public AssociativeArray(int initialSize)
{
_count = 0;
_items = new object[initialSize];
_eventArgs = new EventArgs();
}
public object this[string key]
{
get{ return KeyToObject(key); }
set{ AddToArray(key, value); }
}
public int Length
{
get { return _count; }
}
// 返回枚举对象
public IEnumerator GetEnumerator()
{
return new AssociativeArrayEnumerator(this);
}
// 添加集合改变事件
public void AddOnChanged(ChangeEventHandler handler)
{
Changed += handler;
}
//移除集合改变事件
public void RemoveOnChanged(ChangeEventHandler handler)
{
Changed -= handler;
}
protected void OnChanged()
{
if(Changed != null)
Changed(this, _eventArgs);
}
protected void AddToArray(string key, object item)
{
if(KeyExists(key))
{

for(int n = 0; n < _count; ++n)
{
KeyItemPair pair = (KeyItemPair)_items[n];
if(key == pair.key)
_items[n] = new KeyItemPair(key, item);
}
}
else
{
if(_count == _items.Length)
{
IncreaseCapacity();
}
_items[_count] = new KeyItemPair(key, item);
_count++;
}
}
// 根据key判断结构是否已经在数组中,在就返回ture,
protected bool KeyExists(string key)
{
for(int n = 0; n < _count; ++n)
{
KeyItemPair pair = (KeyItemPair)_items[n];
if(key == pair.key)
return true;
}
return false;
}
//根据key判断结构是否已经在数组中,在的话就返回结构的object成员,否则返回null
protected object KeyToObject(string key)
{
for(int n = 0; n < _count; ++n)
{
KeyItemPair pair = (KeyItemPair)_items[n];
if(key == pair.key)
return pair.item;
}
return null;
}
protected int KeyToIndex(string key)
{
for(int n = 0; n < _count; ++n)
{
KeyItemPair pair = (KeyItemPair)_items[n];
if(key == pair.key)
return n;
}
return -1;
}
protected void IncreaseCapacity() //数组个数不够时,增加容量
{
int size = _items.Length + 5;
object [] oldArray = _items;
_items = new object[size];
oldArray.CopyTo(_items, 0);
}
public event ChangeEventHandler Changed;
protected EventArgs _eventArgs;
//这里把数组设置为internal因此整个程序集都可以访问
public object[] _items;
protected int _count;
internal struct KeyItemPair
{
public KeyItemPair(string k, object obj)
{
key = k;
item = obj;
}
public object item;
public string key;
}
}

public class AssociativeArrayEnumerator : IEnumerator
{
public AssociativeArrayEnumerator(AssociativeArray ar)
{
_ar = ar;
_currIndex = -1;
_invalidated = false;
AssociativeArray.ChangeEventHandler h;
h = new AssociativeArray.ChangeEventHandler(InvalidatedHandler);
ar.AddOnChanged(h);
}
//返回该枚举数实例指向的数组中的元素,如果枚举数已无效,或未指向有效项,就引发异常
public object Current
{
get
{
AssociativeArray.KeyItemPair pair;
if(_invalidated ||
_currIndex == -1 ||
_currIndex == _ar.Length)
throw new InvalidOperationException();
pair = (AssociativeArray.KeyItemPair)_ar._items[_currIndex];
return pair.item;
}
}
//移动到集合中的下一项,如果枚举数引用了一个有效项目则返回true,反之返回false
public bool MoveNext()
{
if(_invalidated || _currIndex == _ar._items.Length)
throw new InvalidOperationException();
_currIndex++;
if(_currIndex == _ar.Length)
return false;
else
return true;
}
//将枚举数组重置为其初始状态
public void Reset()
{
if(_invalidated)
throw new InvalidOperationException();
_currIndex = -1;
}
private void InvalidatedHandler(object sender, EventArgs e)
{
_invalidated = true;
}
protected bool _invalidated; //在更改了与集合相关的数组后,将集合标记为无效的标记
protected int _currIndex; //该枚举数应用的项目索引
protected AssociativeArray _ar; //对该枚举数的相关的数组的引用
}


}

1: 请问AssociativeArray类中定义的Changed事件在客户断是如何被激发的呢?
2: 使用foreach(string str in AssociativeArray的对象)
{
因为使用迭代的时候 str的值是只读的,那么在此改变他 会不会引发Changed事件
}



zhangzengping
回复:

1 客户短要是要 操作激发!

2 不会!

3 误人子弟不负责! 因为我实在是想睡觉了, 没读代码!

llyzcy
回复:

想睡觉了,帮UP

cat_hsfz
回复:

1.我看不到哪里触发了OnChange,所以也看不到有任何理由Change能够被触发。

2.Current只能get,你想set的话就会抛出异常。

Aaron_Xie
回复:

现在不用写着这样的麻烦的,在C#2.0中 直接可以通过迭代的方法来实现枚举,而不用完全手工去实现IEunmerable接口了,编译器自动会在后台生成相应的代码.

1.你以上提供的代码没有激动OnChange,因此不会被激发
2.不会激动异常,如果你试图改变foreach()循环中的只读项,那么编译器会报错.

现在C#2.0实现枚举非常的方便的


相关文章
如何在c# 中使用zlib.dll 库?
[求助]做8出这个题目
什么是键?
指定默认打印机时出错,请教各位高人?
mediaplayer控件在播放前等待时间过长的原因
c#的一个类型转换的问题[给分哦]
一个小小问题关于窗体程序(在线等)
百分求rasional rose破解版下载
如何捕获可执行程序执行的事件?
C#的代码如何在VB中运行呀?
关于自定义 WebControl 使用 ViewState 的问题
请教一个用PICTUREbox显示数据库的图片,有什么方法比较好,当按下一条或上一条记录时能很好的显示?
热门文章
DataGridView如何保存编辑后的行到数据库?
简单问题:combobox 如何把选中的项的value值传到textbox中
如何读取Excel文件中有数据的单元格的行数? (注mysheet.UsedRange.Columns.Count 函数不是非常准确)
c#中,MSChart 如何引用操作!!
子窗体如何调用父窗体的函数和变量,
C#怎样访问Access数据库中的OLE对象类型-----急,请高手帮忙
请教 怎样用C#修改Word的页眉页脚
c# winform datagrieview 编辑添加列进添加的DataGridViewButtonColumn 找不到点击事件?那有?
web中当子窗口弹出后,如何使鼠标点击父窗口上无效?(非模式)
请问我在C#中怎么调用水晶报表,我的水晶报表是11的
如何获取Udp远程主机的信息
C#中如何判断标点符号

编程社区 2008 浙ICP备09013498号
© TinyBBS.cn
编程好站连接:codeproject sf.net codeplex