惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - JulioZou

读书:《Joel软件随想录》——“囚徒的困境”! 《XNA高级编程:Xbox 360和Windows》5-1 《XNA高级编程:Xbox 360和Windows》4-7 《XNA高级编程:Xbox 360和Windows》4-6 《XNA高级编程:Xbox 360和Windows》4-5 《XNA高级编程:Xbox 360和Windows》4-4 《XNA高级编程:Xbox 360和Windows》4-3 《XNA高级编程:Xbox 360和Windows》4-2 《XNA高级编程:Xbox 360和Windows》4-1 《XNA高级编程:Xbox 360和Windows》3-10 《XNA高级编程:Xbox 360和Windows》3-9 《XNA高级编程:Xbox 360和Windows》3-8 《XNA高级编程:Xbox 360和Windows》3-7 《XNA高级编程:Xbox 360和Windows》3-5 《XNA高级编程:Xbox 360和Windows》3-4 《XNA高级编程:Xbox 360和Windows》3-3 《XNA高级编程:Xbox 360和Windows》3-2 《XNA高级编程:Xbox 360和Windows》3-1 《XNA高级编程:Xbox 360和Windows》2-6/2-7
《XNA高级编程:Xbox 360和Windows》3-6
JulioZou · 2009-01-28 · via 博客园 - JulioZou

3.6 StringHelper

    


     StringHelper类是最大的辅助类之一,估计它是我写的第一个辅助类,因为针对字符串的处理操作非常多,很容易就可以想到一些方法来改善性能,更容易地处理字符串列表,输出字符串数据等等。     看一下StringHelper类的结构图(如图3-9所示),您会发现它的方法非常多,重载的方法支持很多不同类型的参数。它还包含大量的单元测试,前面您就曾见过一个。

图3-9

3-9

    

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

提取文件名


    

System.IO命名空间的Path类中,也包含一些类似GetDirectoryCutExtension的方法,不过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类型、特殊的集合类型、byteinteger数组类型以及IEnumerable类型也都存在对应的重载版本,不过使用非引用类型的重载操作速度会更快。

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

/// <summary>
/// Test write array
/// </summary>
// [Test]
public void TestWriteArray()
{
    Assert.AreEqual(
"3, 5, 10",WriteArrayData(new int[] { 3510 }));
    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()