StringBuilder.Chars[Int32] Właściwość

Definicja

Pobiera lub ustawia znak na określonej pozycji znaku w tym wystąpieniu.

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

Parametry

index
Int32

Położenie znaku.

Wartość właściwości

Znak Unicode na pozycji index.

Wyjątki

index jest poza granicami tego wystąpienia podczas ustawiania znaku.

index jest poza granicami tego wystąpienia podczas uzyskiwania znaku.

Uwagi

Parametr index jest pozycją znaku w obiekcie StringBuilder. Pierwszy znak w ciągu znajduje się w indeksie 0. Długość ciągu to liczba znaków, które zawiera. Ostatni dostępny znak StringBuilder wystąpienia znajduje się w indeksie Length — 1.

Chars[Int32] jest domyślną właściwością StringBuilder klasy. W języku C#jest to indeksator. Oznacza to, że poszczególne znaki można pobrać z Chars[Int32] właściwości, jak pokazano w poniższym przykładzie, który zlicza liczbę znaków alfabetycznych, białych i interpunkcyjnych w ciągu.

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

Korzystanie z indeksowania opartego Chars[] na znakach z właściwością może być bardzo powolne w następujących warunkach:

  • Wystąpienie StringBuilder jest duże (na przykład składa się z kilku dziesiątek tysięcy znaków).
  • To StringBuilder jest "fragmenty". Oznacza to, że powtarzające się wywołania metod, takie jak StringBuilder.Append automatycznie rozszerzyły właściwość obiektu StringBuilder.Capacity i przydzieliły do niego nowe fragmenty pamięci.

Wydajność ma poważny wpływ, ponieważ każdy dostęp do znaków przechodzi przez całą połączoną listę fragmentów w celu znalezienia poprawnego buforu do indeksowania.

Uwaga

Nawet w przypadku dużego obiektu "fragmenty" StringBuilder użycie Chars[] właściwości dla dostępu opartego na indeksie do jednej lub małej liczby znaków ma nieznaczny wpływ na wydajność; zazwyczaj jest to operacja O(n). Znaczący wpływ na wydajność występuje podczas iterowania znaków w StringBuilder obiekcie, który jest operacją O(n^2).

Jeśli wystąpią problemy z wydajnością podczas korzystania z indeksowania opartego na znakach z StringBuilder obiektami, możesz użyć dowolnego z następujących obejść:

  • Przekonwertuj StringBuilder wystąpienie na element String , wywołując metodę ToString , a następnie uzyskaj dostęp do znaków w ciągu.

  • Skopiuj zawartość istniejącego StringBuilder obiektu do nowego obiektu o rozmiarze StringBuilder wstępnym. Wydajność poprawia się, ponieważ nowy StringBuilder obiekt nie jest fragmenty. Na przykład:

    // 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)
    
  • Ustaw początkową pojemność StringBuilder obiektu na wartość, która jest w przybliżeniu równa maksymalnemu oczekiwanemu rozmiarowi StringBuilder(Int32) , wywołując konstruktora. Należy pamiętać, że przydziela cały blok pamięci, nawet jeśli StringBuilder rzadko osiąga maksymalną pojemność.

Dotyczy

Zobacz też