StringBuilder
如果你需要 对字符串进行大量的修改应该使用StringBuilder对象,例如在一个循环中附加大量的字符串。首先在代码顶部添加一个StringBuilder变量,这样就无需每帧重新创建这个对象了:
StringBuilder stringBuilder =new StringBuilder();
当你想使用这个方法时,首先将长度设为0清空StringBuilder。然后创建字符串,将它StringBuilder传递到SpriteBatch.DrawString方法中
stringBuilder.Length=0;
stringBuilder.Append("stringBuilder Example:");
for(int i=0;i<10;i++)
stringBuilder.Append(i);
spriteBatch.DrawString(myFont, stringBuilder, new Vector2(50,180), Color.White,0,new Vector2(0,0),0.5f,SpriteEffet.None,0);
另外一个清空的方法:
Str.Length = 0
Str.Remove(0, Str.Length); //清除Str中的所有信息
StringBuilder会自动释放不用的资源的
对StringBuilder非常详尽的分析 →
彻底研究StringBuilder
http://blog.csdn.net/canduecho/archive/2008/12/06/3460145.aspx
1.Hashtable
在.NET Framework中,Hashtable是System.Collections命名空间提供的集合对象,同时它也是一个可变长的数组,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中 key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对.。HashTable中的元素类型是 DictionaryEntry 类型。DictionaryEntry 是一个具有 Key/Value 对的对象类型。
哈希表的简单操作
在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value);
在哈希表中去除某个key/value键值对:HashtableObject.Remove(key);
从哈希表中移除所有元素: HashtableObject.Clear();
判断哈希表是否包含特定键key: HashtableObject.Contains(key);
如:Hashtable ht=new Hashtable();
Ht.Add(×,×)
… …
或者————
Hashtable.ContainsKey(0)
Hashtable.ContainsValue()
遍历哈希表
Hashtable提供了hashTable[aKey]的方式引用其包含的对象,却并没有提供数字指向的索引器,就是说用惯了Array,数组的我们不能用hashTable[0]之类的办法来检索它的内容,继而,我们也就不能用
for(int i =0 ; i < hashTable.count ; i ++)
{
Console.WriteLine("Key -- {0}; Value --{1}.",hashTable[i].key,hashTable[i].value);
} 这样的代码块来遍历
遍历哈希表需要用到DictionaryEntry Object,代码如下:
{
Console.WriteLine(de.Key); // de.Key对应于key/value键值对key
Console.WriteLine(de.Value); // de.Key对应于key/value键值对value
}
另外一种遍历方式:
代码
IDictionaryEnumerator enumerator = thProduct.GetEnumerator();
while (enumerator.MoveNext())
{
arrKey.Add( " @ " + enumerator.Key.ToString()); // Hashtable关健字
arrValue.Add(enumerator.Value.ToString()); // Hashtable值
}
Hashtable快速查找
一般来说我们都是用 Hashtable 的 ContainsKey 方法来查找 Hashtable 中是否存在某个键值然后读取他,但是这个方法并不是效率最好的方法。比较好的方法是直接读取键值然后判断这个对象是否为 null 然后读取。两种代码分别如下:
- 一般慢速的方法:
if (objHash.ContainsKey(keyValue))
{
strValue=(String)objHash[keyValue];
} - 而快速的方法是:
Object objValue=objHash[keyValue];
if (objValue!=null)
{
strValue=(String)objValue;
}
( http://edu.codepub.com/2009/0601/5150.php )
对哈希表进行排序
对哈希表进行排序在这里定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
akeys.Sort(); // 按字母顺序进行排序
foreach ( string skey in akeys)
{
Console.Write(skey + " : " );
Console.WriteLine(ht[skey]); // 排序后输出
}
string s = ( string )ht[ " A " ];
Console.WriteLine(s);
if (ht.Contains( " E " )) // 判断哈希表是否包含特定键,其返回值为true或false
{
Console.WriteLine( " The E key :exist " );
}
ht.Remove( " C " ); // 移除一个key/value键值对
Console.WriteLine(ht[ " A " ]); // 此处输出a
ht.Clear(); // 移除所有元素
Console.WriteLine(ht[ " A " ]); // 此处将不会有任何输出
2. ArryList(数组列表)
ArrayList对象就是一个可变长的数组,可以根据需要添加元素.使用ArrayList的方法可以向数组列表中添加元素,或取出,修改某个元素. 如: ArrayList MyArrayList = new ArrayList(); MyArrayList.add("Caoxi"); MyArrayList.Clear();
ArrayList中取出的对象都是object类型,使用前要将其转换成合适的类型.
theArrayList.Add( " 1 " );
theArrayList.Add( " 2 " );
string s = ( string )theArrayList[ 0 ];
string s1 = ( string )theArrayList[ 1 ];
注意Contains()方法 如果ArrayList中包含参数提供的对象,则返回true,否则返回false
if (theArrayList.Contains("1")) //判断字符"1"是否存在于ArrayList
关于ArryList的另外一种用法:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
objAry = (ArrayList)Application[ " users " ]; // Application["users"]是存储用户的对象,转换为ArryList对象
objAry.Add( this .txtName.Text); // 继续添加当前用户
Application.Lock(); // 锁定对象,防止其他用户同时登陆
Application[ " users " ] = objAry; // 这次的Application["users"]已经加入了当前的用户
Application.UnLock(); // 解锁
// 取出数据
ArrayList objAry = (ArrayList)Application[ " users " ];
for ( int i = 0 ;i < objAry.Count;i ++ )
{
strOnLine += " <B> " + objAry[i].ToString() + " </B><BR> " ;
}
Response.Write(strOnLine);
c#.net ArrayList的用法 http://hi.baidu.com/zhangfengbang/blog/item/3e8b8219515f0172dbb4bd4f.html
ArrayList最佳使用建议
这一节我们来讨论ArrayList与数组的差别,以及ArrayList的效率问题
(1)ArrayList是Array的复杂版本
ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。
(2)内部的Object类型的影响
对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率。
但是恰恰对于大多数人,多数的应用都是使用值类型的数组。
消除这个影响是没有办法的,除非你不用它,否则就要承担一部分的效率损失,不过这部分的损失不会很大。
(3)数组扩容
这是对ArrayList效率影响比较大的一个因素。
每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容 量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。
例1:比如,一个可能有200个元素的数据动态添加到一个以默认16个元素大小创建的ArrayList中,将会经过:
16*2*2*2*2 = 256
四次的扩容才会满足最终的要求,那么如果一开始就以:
ArrayList List = new ArrayList( 210 );
的方式创建ArrayList,不仅会减少4次数组创建和Copy的操作,还会减少内存使用。 例2:预计有30个元素而创建了一个ArrayList:
ArrayList List = new ArrayList(30);
在执行过程中,加入了31个元素,那么数组会扩充到60个元素的大小,而这时候不会有新的元素再增加进来,而且有没有调用TrimSize方法,那么就有1次扩容的操作,并且浪费了29个元素大小的空间。如果这时候,用:
ArrayList List = new ArrayList(40);
那么一切都解决了。
所以说,正确的预估可能的元素,并且在适当的时候调用TrimSize方法是提高ArrayList使用效率的重要途径。
(4)频繁的调用IndexOf、Contains等方法(Sort、BinarySearch等方法经过优化,不在此列)引起的效率损失
首先,我们要明确一点,ArrayList是动态数组,它不包括通过Key或者Value快速访问的算法,所以实际上调用IndexOf、 Contains等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来的快,如果有这方面的要求,建议使用 Hashtable或SortedList等键值对的集合。
遍历ArrayList 对象
//第一种遍历 ArrayList 对象的方法
foreach(object o in al)
{
Console.Write(o.ToString()+" ");
}
//第二种遍历 ArrayList 对象的方法
IEnumerator ie=al.GetEnumerator();
while(ie.MoveNext())
{
Console.Write(ie.Curret.ToString()+" ");
}
//第三种遍历 ArrayList 对象的方法
我忘记了,好象是 利用 ArrayList对象的一个属性,它返回一此对象中的元素个数.
然后在利用索引
for(int i=0;i<Count;i++)
{
Console.Write(al.ToString()+" ");
}
摘自:http://space.univs.cn/?5137/viewspace-48179