C#: 如何获取字符串的第一个字符?

5
我们已经有一个关于如何获取字符串的前16位char的问题(有关详细信息,请参见此处)
这包括以下问题代码:
MyString.ToCharArray[0]

和被接受的答案代码:

MyString[0]

我猜这有一些用处,但当字符串包含文本时,我们希望大家都意识到单个16位字符无法保存一个字符,即使在我们实际指的“码点”方面也是如此。
我是一名程序员,但不是C#程序员。我只是想帮助在线同事修复这样的错误,如果您觉得这是一个太基础的问题,请见谅。
因此,如果我们在C#中有一个字符串,在正确的UTF-16编码下以char数组的形式表示,可能包括作为第一个字符/码点的代理对,因此可能由两个char组成,那么我该如何获取第一个字符?
(我天真地认为Microsoft提供了一个字符串函数来处理这个问题,而我不必手动检查代理对。)

.Net 使用16位来存储“char”,但这并不意味着在 .Net 中的每个字符都由两个字符组成。 - Hossein Narimani Rad
我不确定我是否提出了这样的说法。如果我这么做了,那我知道是错误的。让我检查一下我的措辞... - hippietrail
2个回答

9

您可以使用StringInfo类,该类能够识别代理对和多字节字符。

        var yourstring = "test"; // First char is multibyte char.
        var firstCharOfString = StringInfo.GetNextTextElement(yourstring,0);

我点赞是因为看起来没问题,但现在我在dotnetfiddle上测试它,它打印出的是“test”,而不是“”。如果我将其更改为si.SubstringByTextElements(0),它会打印“test”。 - hippietrail
1
@hippietrail的代码几乎没问题 - Sameer使用了错误的override(已更新),它返回从给定“element”开始的子字符串...显然你已经找到了正确的override,但是为了以后参考,我在这里提供链接SubstringByTextElement - Alexei Levenkov
不,我在这里像个笨蛋一样摸索着,连接到dotnetfiddle.net和MSDN都不稳定,而且对.NET或C#没有特别的了解 - 所以谢谢! - hippietrail
1
@hippietrail..实际上我复制粘贴了我的先前回答中的代码...并忘记编辑代码以适应上下文..已编辑代码 :) - Sameer
谢谢@Sameer - 你能包含相关的“using”吗?在越南,我的在线资源今天早上一直不工作,而我是C#新手,所以如果没有给我提供,我必须查找所有内容。 (-: - hippietrail
明白了!已接受!如果你们能看一下 Iswanto 的答案就好了,因为那个对我不起作用,但我不知道是不是我测试时做错了什么。 - hippietrail

2
请使用以下内容:
str = str.Substring(0, 1);

或者

str[0];

或者

str.FirstOrDefault();

至少在dotnetfiddle.net上,这三个都会导致以下错误: `Run-time exception (line -1): Execution time limit was exceededStack Trace:[DotNetFiddle.Infrastructure.LimitExceededException: Execution time limit was exceeded]` - hippietrail
第一个选项对我来说又快又简单。 - SandstormNick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接