StringBuilder.Chars[Int32] StringBuilder.Chars[Int32] StringBuilder.Chars[Int32] StringBuilder.Chars[Int32] Property

Определение

Возвращает или задает символ на указанной позиции в данном экземпляре.Gets or sets the character at the specified character position in this instance.

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 Int32 Int32 Int32

Позиция символа.The position of the character.

Значение свойства

Символ Юникода в позиции index.The Unicode character at position index.

Исключения

При задании символа index находится за пределами данного экземпляра.index is outside the bounds of this instance while setting a character.

При получении символа index находится за пределами данного экземпляра.index is outside the bounds of this instance while getting a character.

Комментарии

Параметр — это расположение символа StringBuilderв. indexThe index parameter is the position of a character within the StringBuilder. Первый символ в строке находится по индексу 0.The first character in the string is at index 0. Длина строки — это количество содержащихся в ней символов.The length of a string is the number of characters it contains. Последний доступный символ StringBuilder экземпляра имеет индекс Length -1.The last accessible character of a StringBuilder instance is at index Length - 1.

Chars[Int32]Свойство StringBuilder класса по умолчанию.Chars[Int32] is the default property of the StringBuilder class. В C#это индексатор.In C#, it is an indexer. Это означает, что отдельные символы могут быть получены из Chars[Int32] свойства, как показано в следующем примере, который подсчитывает количество алфавитных, пробелов и знаков препинания в строке.This means that individual characters can be retrieved from the Chars[Int32] property as shown in the following example, which counts the number of alphabetic, white-space, and punctuation characters in a string.

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
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

Производительность и индексирование на основе символовPerformance and character-based indexing

Индексирование на основе символов со свойством Chars[Int32] может работать очень медленно при следующих условиях:Using character-based indexing with the Chars[Int32] property can be extremely slow under the following conditions:

  • Экземпляр StringBuilder очень большой (например, состоит из нескольких десятков тысяч символов).The StringBuilder instance is large (for example, it consists of several tens of thousands of characters).
  • StringBuilder имеет блоки.The StringBuilder is "chunky." То есть повторные вызовы методов, например StringBuilder.Append, автоматически расширили свойство StringBuilder.Capacity объекта и выделили для него новые блоки памяти.That is, repeated calls to methods such as StringBuilder.Append have automatically expanded the object's StringBuilder.Capacity property and allocated new chunks of memory to it.

Это значительно влияет на производительность, поскольку при каждом доступе к символу проходится весь связанный список блоков с целью найти правильный буфер для индексации.Performance is severely impacted because each character access walks the entire linked list of chunks to find the correct buffer to index into.

Примечание

Даже когда большой объект StringBuilder с блоками использует свойство Chars[Int32] для доступа на основе индекса к одному символу или небольшому количеству символов, это оказывает незначительное влияние на производительность. Как правило, это операция 0(n) .Even for a large "chunky" StringBuilder object, using the Chars[Int32] property for index-based access to one or a small number of characters has a negligible performance impact; typically, it is an 0(n) operation. Производительность серьезно снижается во время итерации символов в объекте StringBuilder — операция O(n^2) .The significant performance impact occurs when iterating the characters in the StringBuilder object, which is an O(n^2) operation.

Если возникают проблемы с производительностью при использовании символьного индексирования с объектами StringBuilder, попробуйте выполнить одно из следующих действий:If you encounter performance issues when using character-based indexing with StringBuilder objects, you can use any of the following workarounds:

  • Преобразуйте экземпляр StringBuilder в String путем вызова метода ToString, а затем получите доступ к символам в строке.Convert the StringBuilder instance to a String by calling the ToString method, then access the characters in the string.

  • Скопируйте содержимое существующего объекта StringBuilder в новый объект StringBuilder с заданным размером.Copy the contents of the existing StringBuilder object to a new pre-sized StringBuilder object. Производительность повышается, так как новый объект StringBuilder не содержит блоков.Performance improves because the new StringBuilder object is not chunky. Например:For example:

    // 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 значение, примерно равное максимальному ожидаемому размеру, путем вызова конструктора StringBuilder(Int32).Set the initial capacity of the StringBuilder object to a value that is approximately equal to its maximum expected size by calling the StringBuilder(Int32) constructor. Имейте в виду, что будет выделен целый блок памяти, даже если StringBuilder редко достигает своего максимального размера.Note that this allocates the entire block of memory even if the StringBuilder rarely reaches its maximum capacity.

Применяется к

Дополнительно