20100609 学习记录:清空StringBuilder && HashTable VS. ArrayList

清空StringBuilder的方法

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);


另外一个清空的方法:

StringBuilder   Str   =   new   StringBuilder();
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,代码如下:

             foreach  (DictionaryEntry de  in  ht)    // ht为一个Hashtable实例
            {
                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 然后读取。两种代码分别如下:

  1. 一般慢速的方法:if (objHash.ContainsKey(keyValue))
    {
        strValue=(String)objHash[keyValue]; 
    }
  2. 而快速的方法是:Object objValue=objHash[keyValue];
    if (objValue!=null)
    {
        strValue=(String)objValue;
    }
两种方法的速度经过测试能差一倍左右。 如果不需要获得对应键的值,而是只 判断 的话,两种方法的区别不会很明显 ,大家有空可以测试下
http://edu.codepub.com/2009/0601/5150.php

 

 

对哈希表进行排序 

对哈希表进行排序在这里定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:


ExpandedBlockStart.gif Sort
            ArrayList akeys  =   new  ArrayList(ht.Keys);    // 别忘记了导入System.Collections
            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类型,使用前要将其转换成合适的类型.

 

ArrayList theArrayList  =   new  ArrayList();
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的另外一种用法:

 

ExpandedBlockStart.gif 代码
        ArrayList objAry = new  ArrayList();

        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

 

 

转载于:https://www.cnblogs.com/neru/archive/2010/06/10/1755322.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值