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

C# 确定字符串中第一个字符的最有效方法?,c#,.net,substring,C#,.net,Substring,以下哪种方法是最有效的,或者有更好的方法吗 this.returnList[i].Title[0].ToString() 或 我认为从效率上讲这并不重要,但在我看来,返回第一个字符的更清晰、更惯用、因而更易于维护的方法是使用索引运算符: char c = returnList[i].Title[0]; 当然,这假设至少有一个字符,如果不是给定的,则必须检查该字符。这些字符的性能应该接近相同 操作中代价高昂的部分是创建字符串,没有比这更有效的方法了 当然,除非您想为所有可能的字符预创建字符串并

以下哪种方法是最有效的,或者有更好的方法吗

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


我认为从效率上讲这并不重要,但在我看来,返回第一个字符的更清晰、更惯用、因而更易于维护的方法是使用索引运算符:

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

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

这些字符的性能应该接近相同

操作中代价高昂的部分是创建字符串,没有比这更有效的方法了


当然,除非您想为所有可能的字符预创建字符串并存储在字典中,否则对于这样一项琐碎的任务,这将占用大量内存。

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

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


虽然性能差异可能并不重要,但更好的可读性肯定会起作用。

它们都非常快:

字符索引

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时钟=新秒表();
对于(变量i=0;i<10;i++)
{
clock.Start();
对于(var j=0;j<10000000;j++)
{
var first=sample[0]。ToString();
}
时钟停止();
控制台写入(时钟已过);
时钟复位();
}
//结果
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
var sample=“sample”;
var时钟=新秒表();
对于(变量i=0;i<10;i++)
{
clock.Start();
对于(var j=0;j<10000000;j++)
{
var first=样本子串(0,1);
}
时钟停止();
控制台写入(时钟已过);
时钟复位();
}
//结果
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]
可能只是Unicode点的一个
char
。如果要返回字符串的第一个Unicode grapheme:

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图形可以是多个字符。

这有关系吗?您是否有性能问题?你说了什么?我会在你回读代码时使用对你最有意义的基准测试。而且,如果你只是好奇,这是公平的,它很容易测量。@Oded我在我的C#职业生涯中还很早,了解这类事情可能会帮助我在未来编写更好的代码。@codekaizen谢谢你,我将对此进行研究。感谢您以如此清晰的方式说明这一区别@天啊,没问题。下载LINQPad它是免费的,绝对不可或缺。它将允许您快速轻松地使用和测试C代码。此外,如果答案令人满意,请确保将其检查为已接受。实际上,当您将字符转换回字符串时,您仍然需要创建一个新字符串。(
char.ToString()
)@Charles,为什么不直接比较chars呢
returnList[I]。Title[0]='A'c
@Charles:为什么要将字符转换回字符串?传递固定长度的1个字符串没有多大意义…请看OP发布的代码。问题指定对字符执行ToString()。
string s = returnList[i].Title;
if (string.IsNullOrEmpty(s))
    return s;

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