StringBuilder.Chars[Int32] Свойство

Определение

Возвращает или задает символ на указанной позиции в данном экземпляре.

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

Позиция символа.

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

Char

Символ Юникода в позиции index.

Исключения

При задании символа index находится за пределами данного экземпляра.

При получении символа index находится за пределами данного экземпляра.

Комментарии

Параметр index — это позиция символа внутри StringBuilder. Первый символ в строке равен индексу 0. Длина строки — это количество содержащихся в ней символов. Последний доступный символ экземпляра StringBuilder находится в индексе Length – 1.

Chars[] является свойством StringBuilder класса по умолчанию. В C# это индексатор. Это означает, что отдельные символы можно извлечь из Chars[] свойства, как показано в следующем примере, что подсчитывает количество символов алфавита, пробелов и знаков препинания в строке.

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

Индексирование на основе производительности и символов

Индексирование на основе символов со свойством Chars[] может работать очень медленно при следующих условиях:

  • Экземпляр StringBuilder очень большой (например, состоит из нескольких десятков тысяч символов).
  • StringBuilder имеет блоки. То есть повторные вызовы методов, например StringBuilder.Append, автоматически расширили свойство StringBuilder.Capacity объекта и выделили для него новые блоки памяти.

Это значительно влияет на производительность, поскольку при каждом доступе к символу проходится весь связанный список блоков с целью найти правильный буфер для индексации.

Примечание

Даже когда большой объект StringBuilder с блоками использует свойство Chars[] для доступа на основе индекса к одному символу или небольшому количеству символов, это оказывает незначительное влияние на производительность. Как правило, это операция 0(n). Производительность серьезно снижается во время итерации символов в объекте StringBuilder — операция O(n^2).

Если возникают проблемы с производительностью при использовании символьного индексирования с объектами StringBuilder, попробуйте выполнить одно из следующих действий:

  • Преобразуйте экземпляр StringBuilder в String путем вызова метода ToString, а затем получите доступ к символам в строке.

  • Скопируйте содержимое существующего объекта 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 значение, примерно равное максимальному ожидаемому размеру, путем вызова конструктора StringBuilder(Int32). Имейте в виду, что будет выделен целый блок памяти, даже если StringBuilder редко достигает своего максимального размера.

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

См. также раздел