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

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

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

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

Исключения

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

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

Комментарии

Параметр index — это позиция символа в .StringBuilder Первый символ в строке имеет индекс 0. Длина строки — это количество содержащихся в ней символов. Последний доступный символ экземпляра StringBuilder имеет значение index 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, попробуйте выполнить одно из следующих действий:

  • Преобразуйте экземпляр 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 редко достигает своего максимального размера.

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

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