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

时间:2011-12-06 17:36:45

标签: c# .net substring

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

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

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

5 个答案:

答案 0 :(得分:3)

他们都非常快:

字符索引

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万亿次,它会快得多!

答案 1 :(得分:2)

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

C#字符串包含UTF-16,它是一个可变长度编码,如果returnList是一个字符串数组,那么returnList[i]可能只是Unicode点的一个char 。如果要返回字符串的第一个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点或字形,而不是字符,你必须使用字符串; Unicode字素可以是多个字符。

答案 2 :(得分:1)

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

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

这假设当然至少有一个角色,如果不是给定的,你必须检查它。

答案 3 :(得分:0)

那些性能应该接近相同。

操作的昂贵部分是创建字符串,没有更有效的方法来做到这一点。

除非您想为所有可能的字符预先创建字符串并存储在字典中,否则会耗费大量内存来执行这样一项简单的任务。

答案 4 :(得分:0)

returnList[I].Title[0]要快得多,因为它不需要创建新的string,只能访问原始的char。 当然,如果字符串为空,它将抛出异常,因此您应首先检查它。

根据经验,永远不要使用固定长度为1的字符串。这就是char的用途。

虽然性能差异不太重要,但可读性肯定会更好。