StringBuilder.Chars[Int32] 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取或设置此实例中指定字符位置处的字符。
public:
property char default[int] { char get(int index); void set(int index, char value); };
public char this[int index] { get; set; }
member this.Chars(int) : char with get, set
Default Public Property Chars(index As Integer) As Char
参数
- index
- Int32
字符的位置。
属性值
index
位置处的 Unicode 字符。
例外
设置字符时,index
在此实例的范围之外。
获取字符时,index
在此实例的范围之外。
注解
参数 index
是 字符在 中 StringBuilder的位置。 字符串中的第一个字符位于索引 0。 字符串的长度是它包含的字符数。 实例的最后一个 StringBuilder 可访问字符位于索引 Length - 1。
Chars[Int32] 是 类的默认属性 StringBuilder 。 在 C# 中,它是一个索引器。 这意味着可以从 属性中检索 Chars[Int32] 单个字符,如以下示例所示,该属性对字符串中的字母、空格和标点符号字符数进行计数。
using System;
using System.Text;
public class Example
{
public static void Main()
{
int nAlphabeticChars = 0;
int nWhitespace = 0;
int nPunctuation = 0;
StringBuilder sb = new StringBuilder("This is a simple sentence.");
for (int ctr = 0; ctr < sb.Length; ctr++) {
char ch = sb[ctr];
if (Char.IsLetter(ch)) { nAlphabeticChars++; continue; }
if (Char.IsWhiteSpace(ch)) { nWhitespace++; continue; }
if (Char.IsPunctuation(ch)) nPunctuation++;
}
Console.WriteLine("The sentence '{0}' has:", sb);
Console.WriteLine(" Alphabetic characters: {0}", nAlphabeticChars);
Console.WriteLine(" White-space characters: {0}", nWhitespace);
Console.WriteLine(" Punctuation characters: {0}", nPunctuation);
}
}
// The example displays the following output:
// The sentence 'This is a simple sentence.' has:
// Alphabetic characters: 21
// White-space characters: 4
// Punctuation characters: 1
open System
open System.Text
let mutable nAlphabeticChars = 0
let mutable nWhitespace = 0
let mutable nPunctuation = 0
let sb = StringBuilder "This is a simple sentence."
for i = 0 to sb.Length - 1 do
let ch = sb[i]
if Char.IsLetter ch then
nAlphabeticChars <- nAlphabeticChars + 1
elif Char.IsWhiteSpace ch then
nWhitespace <- nWhitespace + 1
elif Char.IsPunctuation ch then
nPunctuation <- nPunctuation + 1
printfn $"The sentence '{sb}' has:"
printfn $" Alphabetic characters: {nAlphabeticChars}"
printfn $" White-space characters: {nWhitespace}"
printfn $" Punctuation characters: {nPunctuation}"
// The example displays the following output:
// The sentence 'This is a simple sentence.' has:
// Alphabetic characters: 21
// White-space characters: 4
// Punctuation characters: 1
Imports System.Text
Module Example
Public Sub Main()
Dim nAlphabeticChars As Integer = 0
Dim nWhitespace As Integer = 0
Dim nPunctuation As Integer = 0
Dim sb As New StringBuilder("This is a simple sentence.")
For ctr As Integer = 0 To sb.Length - 1
Dim ch As Char = sb(ctr)
If Char.IsLetter(ch) Then nAlphabeticChars += 1 : Continue For
If Char.IsWhiteSpace(ch) Then nWhitespace += 1 : Continue For
If Char.IsPunctuation(ch) Then nPunctuation += 1
Next
Console.WriteLine("The sentence '{0}' has:", sb)
Console.WriteLine(" Alphabetic characters: {0}", nAlphabeticChars)
Console.WriteLine(" White-space characters: {0}", nWhitespace)
Console.WriteLine(" Punctuation characters: {0}", nPunctuation)
End Sub
End Module
' The example displays the following output:
' The sentence 'This is a simple sentence.' has:
' Alphabetic characters: 21
' White-space characters: 4
' Punctuation characters: 1
在以下情况下,通过 Chars[] 属性使用基于字符的索引可能会非常缓慢:
- StringBuilder 实例很大(例如,它由数以万计的字符组成)。
- 是 StringBuilder “区块”。也就是说,对方法(如) StringBuilder.Append 的重复调用会自动扩展对象的 StringBuilder.Capacity 属性,并为其分配新的内存块。
因为每次字符访问都会遍历区块的整个链接列表以查找要索引到的正确缓冲区,所以性能受到严重影响。
注意
即使对于大型“区块” StringBuilder 对象,使用 Chars[] 属性进行基于索引的访问一个或少量字符的性能影响可以忽略不计;通常,这是 一个 O (n) 操作。 当迭代 StringBuilder 对象中的字符时,会对性能造成显著的影响,这是 O(n^2) 操作。
如果通过 StringBuilder 对象在使用基于字符的索引时遇到性能问题,可以使用以下任一解决方法:
通过调用 ToString 方法,将 StringBuilder 实例转换为 String,然后访问字符串中的字符。
将现有的 StringBuilder 对象的内容复制到新的预调整大小的 StringBuilder 对象。 由于新的 StringBuilder 对象并不笨重,因此可以提升性能。 例如:
// sbOriginal is the existing StringBuilder object var sbNew = new StringBuilder(sbOriginal.ToString(), sbOriginal.Length);
' sbOriginal is the existing StringBuilder object Dim sbNew = New StringBuilder(sbOriginal.ToString(), sbOriginal.Length)
通过调用 StringBuilder(Int32) 构造函数,将 StringBuilder 对象的初始容量设置为约等于其最大预期大小的值。 请注意,即使 StringBuilder 很少达到其最大容量,它仍会分配整个内存块。