《XNA高级编程:Xbox 360和Windows》3-6

3.6 StringHelper

    
     StringHelper 类是最大的辅助类之一,估计它是我写的第一个辅助类,因为针对字符串的处理操作非常多,很容易就可以想到一些方法来改善性能,更容易地处理字符串列表,输出字符串数据等等。

     看一下 StringHelper 类的结构图(如图 3-9 所示),您会发现它的方法非常多,重载的方法支持很多不同类型的参数。它还包含大量的单元测试,前面您就曾见过一个。

图3-9

3-9

     您可能会问为什么这个类中的方法那么多,而单元测试却那么少。这是因为很多年前我就开始写这个类了,而那个时候还没开始使用单元测试。其中有些方法现在在 .Net 2.0 Framework 中已经被实现了,所以它们也就没有太大的意义,不过我还是习惯于使用自己写的方法,我只是希望其中的某些方法对您能有所帮助。要想熟练使用这么多的方法的确需要一些时间,不过当您发现某个方法可以满足您进行一项复杂的字符串操作时,您或许会感谢我(当然也可能是感谢您自己,如果您有自己的辅助类的话)。

提取文件名


     System.IO 命名空间的 Path 类中,也包含一些类似 GetDirectory CutExtension 的方法,不过 StringHelper 类中用来处理文件名的最有用的方法之一就是 ExtractFilename ,它去掉了文件的路径名和扩展名,仅仅剩下文件的名字。 Path 类中的 GetFileNameWithoutExtension 方法也可以做类似的操作,不过出于某些原因我还是更喜欢自己的方法。如果您想实现自己的方法,并需要一些实际的工作代码,这会很有趣。再强调一次:您不必自己写 Path 类中已经存在的方法,除非您不知道 Framwork 中已经提供了,或者您想自己去研究一下。

     我已经很久没有测试 StringHelper 类中方法的处理性能了,不过我猜大多数方法的处理速度要比 Path 类中的快得多。

///   <summary>
///  Extracts filename from full path+filename, cuts off extension
///  if cutExtension is true. Can be also used to cut of directories
///  from a path (only last one will remain).
///   </summary>
static   public   string  ExtractFilename( string  pathFile,  bool  cutExtension)
{
    
if  (pathFile  ==   null )
        
return   "" ;
    
//  Support windows and unix slashes
     string [] fileName  =  pathFile.Split( new   char [] {  ' \\ ' ' / '  });
    
if  (fileName.Length  ==   0 )
    {
        
if  (cutExtension)
            
return  CutExtension(pathFile);
        
return  pathFile;
    } 
//  if (fileName.Length)
     if  (cutExtension)
        
return  CutExtension(fileName[fileName.Length  -   1 ]);
    
return  fileName[fileName.Length  -   1 ];
//  ExtractFilename(pathFile, cutExtension)

     给这样的方法写单元测试也很简单,使用下面的代码来检查输出的结果是否在正确:

Assert.AreEqual( " SomeFile " ,
                StringHelper.ExtractFilename(
" SomeDir\\SomeFile.bmp " ));

输出列表

     StringHelper 类中另一个比较特殊的方法是 WriteArrayData ,它把像列表、数组以及 IEnumerable 数据输出为文本字符串,这样它们就可以被写入日志文件中。它的实现也非常简单:
///   <summary>
///  Returns a string with the array data, ArrayList version.
///   </summary>
static   public   string  WriteArrayData(ArrayList array)
{
    StringBuilder ret 
=   new  StringBuilder();
    
if  (array  !=   null )
        
foreach  ( object  obj  in  array)
            ret.Append((ret.Length 
==   0   ?   ""  :  " " +  obj.ToString());
    
return  ret.ToString();
//  WriteArrayData(array)

     列表和泛型列表都是从 ArrayList 类继承而来的,所以可以给这个方法传递动态列表类型。另外,对于 Array 类型、特殊的集合类型、 byte integer 数组类型以及 IEnumerable 类型也都存在对应的重载版本,不过使用非引用类型的重载操作速度会更快。

     可以使用下面的代码来测试 WriteArrayData 方法:

///   <summary>
///  Test write array
///   </summary>
//  [Test]
public   void  TestWriteArray()
{
    Assert.AreEqual(
" 3, 5, 10 " ,WriteArrayData( new   int [] {  3 5 10  }));
    Assert.AreEqual(
" one, after, another " ,
            WriteArrayData(
new   string [] {  " one " " after " " another "  }));
    List
< string >  genericList  =   new  List < string > ();
    genericList.Add(
" whats " );
    genericList.AddRange(
new   string [] {  " going " " on "  });
    Assert.AreEqual(
" whats, going, on " ,
            WriteArrayData(genericList));
//  TestWriteArray()

转载于:https://www.cnblogs.com/AlexCheng/archive/2010/05/11/2120331.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值