繁体   English   中英

确定字符串中第一个字符的最有效方法?

[英]Most efficient way to determine first character in string?

这些方法中哪一种是最有效的,或者有更好的方法呢?

this.returnList[i].Title[0].ToString()

要么

this.returnList[i].Title.Substring(0, 1)

它们都非常快:

字符索引

var sample = "sample";
var clock = new Stopwatch();
for (var i = 0; i < 10; i++)
{
    clock.Start();
    for (var j = 0; j < 10000000; j++)
    {
        var first = sample[0].ToString();
    }
    clock.Stop();
    Console.Write(clock.Elapsed);
    clock.Reset();
}

// Results
00:00:00.2012243
00:00:00.2207168
00:00:00.2184807
00:00:00.2258847
00:00:00.2296456
00:00:00.2261465
00:00:00.2120131
00:00:00.2221702
00:00:00.2346083
00:00:00.2330840

var sample = "sample";
var clock = new Stopwatch();
for (var i = 0; i < 10; i++)
{
    clock.Start();
    for (var j = 0; j < 10000000; j++)
    {
        var first = sample.Substring(0, 1);
    }
    clock.Stop();
    Console.Write(clock.Elapsed);
    clock.Reset();
}

// Results
00:00:00.3268155
00:00:00.3337077
00:00:00.3439908
00:00:00.3273090
00:00:00.3380794
00:00:00.3400650
00:00:00.3280275
00:00:00.3333719
00:00:00.3295982
00:00:00.3368425

我也同意BrokenGlass的观点,即使用char索引是一种更干净的编写方式。 另外,如果您执行10万亿次,它将更快!

您的代码中存在一个很大的漏洞,可能会导致问题,具体取决于“第一个字符”的含义以及returnList包含的内容。

C#字符串包含UTF-16,这是一个可变长度编码,并且如果returnList是一个字符串数组,然后returnList[i]可能仅仅是一个char一个Unicode点。 如果要返回字符串的第一个Unicode字形:

string s = returnList[i].Title;
if (string.IsNullOrEmpty(s))
    return s;

int charsInGlyph = char.IsSurrogatePair(s, 0) ? 2 : 1;
return s.Substring(0, charsInGlyph);

使用BOM,标记和组合字符会遇到相同的问题; 这些都是有效字符,但是如果显示给用户则没有意义。

如果要使用Unicode点或字形而不是char,则必须使用字符串;否则,请使用字符串。 Unicode字素可以是多个字符。

我认为效率的提高并不重要,但是在我看来,返回第一个字符的更清晰,更惯用和因此更可维护的方式是使用索引运算符:

char c = returnList[i].Title[0];

当然,这假定至少有一个字符,如果不是给定字符,则必须检查该字符。

这些应该在性能上几乎相同。

该操作的昂贵部分是创建字符串,并且没有更有效的方法来执行该操作。

除非有必要,否则您要为所有可能的字符预先创建字符串并将其存储在字典中,但这将为这种琐碎的任务占用大量内存。

returnList[I].Title[0]更快,因为它不需要创建新string ,而只需要访问原始string一个字符即可。 当然,如果字符串为空,它将引发异常,因此您应该首先检查该异常。

根据经验,切勿使用固定长度为1的字符串。这就是char的用途。

虽然性能差异并不大,但更好的可读性肯定会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM