System.String sınıfı
Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.
Dize, metni temsil etmek için kullanılan sıralı bir karakter koleksiyonudur. String Nesne, bir dizeyi temsil eden sıralı bir nesne koleksiyonudurSystem.Char; System.Char nesne utf-16 kod birimine karşılık gelir. nesnesinin String değeri, sıralı nesne koleksiyonunun System.Char içeriğidir ve bu değer sabittir (yani salt okunurdur). Dizelerin değişmezliği hakkında daha fazla bilgi için, Değişmezlik ve StringBuilder sınıfı bölümüne bakın. Bellekteki nesne String boyutu üst sınırı 2 GB veya yaklaşık 1 milyar karakterdir.
Unicode, UTF-16, kod birimleri, kod noktaları ve ve Char Rune türleri hakkında daha fazla bilgi için bkz . .NET'te karakter kodlamaya giriş.
String nesnesinin örneğini oluşturma
Bir nesnenin örneğini String aşağıdaki yollarla oluşturabilirsiniz:
Bir değişkene String dize değişmez değeri atayarak. Bu, dize oluşturmak için en yaygın kullanılan yöntemdir. Aşağıdaki örnek, birkaç dize oluşturmak için atamayı kullanır. C# ve F# dilinde ters eğik çizgi (\) bir kaçış karakteri olduğundan, bir dizedeki değişmez değer ters eğik çizgilerinin kaçılması veya dizenin tamamının @tırnak içine alınması gerektiğini unutmayın.
string string1 = "This is a string created by assignment."; Console.WriteLine(string1); string string2a = "The path is C:\\PublicDocuments\\Report1.doc"; Console.WriteLine(string2a); string string2b = @"The path is C:\PublicDocuments\Report1.doc"; Console.WriteLine(string2b); // The example displays the following output: // This is a string created by assignment. // The path is C:\PublicDocuments\Report1.doc // The path is C:\PublicDocuments\Report1.doc
let string1 = "This is a string created by assignment." printfn "%s" string1 let string2a = "The path is C:\\PublicDocuments\\Report1.doc" printfn "%s" string2a let string2b = @"The path is C:\PublicDocuments\Report1.doc" printfn "%s" string2b // The example displays the following output: // This is a string created by assignment. // The path is C:\PublicDocuments\Report1.doc // The path is C:\PublicDocuments\Report1.doc
Dim string1 As String = "This is a string created by assignment." Console.WriteLine(string1) Dim string2 As String = "The path is C:\PublicDocuments\Report1.doc" Console.WriteLine(string2) ' The example displays the following output: ' This is a string created by assignment. ' The path is C:\PublicDocuments\Report1.doc
Sınıf String oluşturucuyu çağırarak. Aşağıdaki örnek, çeşitli sınıf oluşturucularını çağırarak dizelerin örneğini oluşturur. Oluşturuculardan bazılarının karakter dizileri işaretçileri veya imzalı bayt dizilerini parametre olarak içerdiğini unutmayın. Visual Basic bu oluşturuculara yapılan çağrıları desteklemez. Oluşturucular hakkında String ayrıntılı bilgi için oluşturucu özeti bölümüne String bakın.
char[] chars = { 'w', 'o', 'r', 'd' }; sbyte[] bytes = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x00 }; // Create a string from a character array. string string1 = new string(chars); Console.WriteLine(string1); // Create a string that consists of a character repeated 20 times. string string2 = new string('c', 20); Console.WriteLine(string2); string stringFromBytes = null; string stringFromChars = null; unsafe { fixed (sbyte* pbytes = bytes) { // Create a string from a pointer to a signed byte array. stringFromBytes = new string(pbytes); } fixed (char* pchars = chars) { // Create a string from a pointer to a character array. stringFromChars = new string(pchars); } } Console.WriteLine(stringFromBytes); Console.WriteLine(stringFromChars); // The example displays the following output: // word // cccccccccccccccccccc // ABCDE // word
let chars = [| 'w'; 'o'; 'r'; 'd' |] let bytes = [| 0x41y; 0x42y; 0x43y; 0x44y; 0x45y; 0x00y |] // Create a string from a character array. let string1 = String chars printfn "%s" string1 // Create a string that consists of a character repeated 20 times. let string2 = String('c', 20) printfn "%s" string2 let stringFromBytes = // Create a string from a pointer to a signed byte array. use pbytes = fixed bytes String pbytes let stringFromChars = // Create a string from a pointer to a character array. use pchars = fixed chars String pchars printfn $"{stringFromBytes}" printfn $"{stringFromChars}" // The example displays the following output: // word // cccccccccccccccccccc // ABCDE // word
Dim chars() As Char = {"w"c, "o"c, "r"c, "d"c} ' Create a string from a character array. Dim string1 As New String(chars) Console.WriteLine(string1) ' Create a string that consists of a character repeated 20 times. Dim string2 As New String("c"c, 20) Console.WriteLine(string2) ' The example displays the following output: ' word ' cccccccccccccccccccc
Herhangi bir örnek ve dize değişmez değeri bileşiminden String tek bir dize oluşturmak için dize birleştirme işlecini (C# ve F# dilinde + ve Visual Basic'te & veya +) kullanarak. Aşağıdaki örnekte dize birleştirme işlecinin kullanımı gösterilmektedir.
string string1 = "Today is " + DateTime.Now.ToString("D") + "."; Console.WriteLine(string1); string string2 = "This is one sentence. " + "This is a second. "; string2 += "This is a third sentence."; Console.WriteLine(string2); // The example displays output like the following: // Today is Tuesday, July 06, 2011. // This is one sentence. This is a second. This is a third sentence.
let string1 = "Today is " + DateTime.Now.ToString("D") + "." printfn $"{string1}" let string2 = "This is one sentence. " + "This is a second. " let string2 = string2 + "This is a third sentence." printfn $"{string2}" // The example displays output like the following: // Today is Tuesday, July 06, 2011. // This is one sentence. This is a second. This is a third sentence.
Dim string1 As String = "Today is " + Date.Now.ToString("D") + "." Console.WriteLine(string1) Dim string2 As String = "This is one sentence. " + "This is a second. " string2 += "This is a third sentence." Console.WriteLine(string2) ' The example displays output like the following: ' Today is Tuesday, July 06, 2011. ' This is one sentence. This is a second. This is a third sentence.
Bir özelliği alarak veya dize döndüren bir yöntemi çağırarak. Aşağıdaki örnek, daha büyük bir dizeden alt dize ayıklamak için sınıfının yöntemlerini String kullanır.
string sentence = "This sentence has five words."; // Extract the second word. int startPosition = sentence.IndexOf(" ") + 1; string word2 = sentence.Substring(startPosition, sentence.IndexOf(" ", startPosition) - startPosition); Console.WriteLine("Second word: " + word2); // The example displays the following output: // Second word: sentence
let sentence = "This sentence has five words." // Extract the second word. let startPosition = sentence.IndexOf " " + 1 let word2 = sentence.Substring(startPosition, sentence.IndexOf(" ", startPosition) - startPosition) printfn $"Second word: {word2}" // The example displays the following output: // Second word: sentence
Dim sentence As String = "This sentence has five words." ' Extract the second word. Dim startPosition As Integer = sentence.IndexOf(" ") + 1 Dim word2 As String = sentence.Substring(startPosition, sentence.IndexOf(" ", startPosition) - startPosition) Console.WriteLine("Second word: " + word2) ' The example displays the following output: ' Second word: sentence
Bir değeri veya nesneyi dize gösterimine dönüştürmek için bir biçimlendirme yöntemi çağırarak. Aşağıdaki örnek, iki nesnenin dize gösterimini bir dizeye eklemek için bileşik biçimlendirme özelliğini kullanır.
DateTime dateAndTime = new DateTime(2011, 7, 6, 7, 32, 0); double temperature = 68.3; string result = String.Format("At {0:t} on {0:D}, the temperature was {1:F1} degrees Fahrenheit.", dateAndTime, temperature); Console.WriteLine(result); // The example displays the following output: // At 7:32 AM on Wednesday, July 06, 2011, the temperature was 68.3 degrees Fahrenheit.
let dateAndTime = DateTime(2011, 7, 6, 7, 32, 0) let temperature = 68.3 String.Format("At {0:t} on {0:D}, the temperature was {1:F1} degrees Fahrenheit.", dateAndTime, temperature) |> printfn "%s" // The example displays the following output: // At 7:32 AM on Wednesday, July 06, 2011, the temperature was 68.3 degrees Fahrenheit.
Dim dateAndTime As DateTime = #07/06/2011 7:32:00AM# Dim temperature As Double = 68.3 Dim result As String = String.Format("At {0:t} on {0:D}, the temperature was {1:F1} degrees Fahrenheit.", dateAndTime, temperature) Console.WriteLine(result) ' The example displays the following output: ' At 7:32 AM on Wednesday, July 06, 2011, the temperature was 68.3 degrees Fahrenheit.
Karakter nesneleri ve Unicode karakterleri
Dizedeki her karakter, Unicode kod noktası veya Unicode karakterinin sıralı (sayısal) değeri olarak da adlandırılan Unicode skaler değeriyle tanımlanır. Her kod noktası UTF-16 kodlaması kullanılarak kodlanır ve kodlamanın her öğesinin sayısal değeri bir Char nesne tarafından temsil edilir.
Not
Örneğin String UTF-16 kod birimlerinin sıralı koleksiyonundan oluştuğundan, iyi biçimlendirilmiş bir Unicode dizesi olmayan bir String nesne oluşturmak mümkündür. Örneğin, karşılık gelen yüksek vekil olmadan düşük vekili olan bir dize oluşturmak mümkündür. Ad alanında nesneleri System.Text kodlama ve kod çözme yöntemleri gibi bazı yöntemler, dizelerin iyi biçimlendirildiğinden emin olmak için denetimler gerçekleştirse de, String sınıf üyeleri bir dizenin düzgün biçimlendirildiğinden emin olmaz.
Tek Char bir nesne genellikle tek bir kod noktasını temsil eder; yani sayısal değeri Char kod noktasına eşittir. Örneğin, "a" karakterinin kod noktası U+0061'dir. Ancak, bir kod noktası birden fazla kodlanmış öğe (birden Char fazla nesne) gerektirebilir. Unicode standardı, birden çok Char nesneye karşılık gelen iki karakter türünü tanımlar: graphemes ve Unicode tamamlayıcı düzlemlerindeki karakterlere karşılık gelen Unicode ek kod noktaları.
Grafeme, bir temel karakterle ve ardından bir veya daha fazla birleştirme karakteriyle gösterilir. Örneğin, ğkarakteri, kod noktası U+0061 olan ve Char ardından kod noktası U+0308 olan bir Char nesneyle temsil edilir. Bu karakter, U+00E4 kod noktasına sahip tek Char bir nesne tarafından da tanımlanabilir. Aşağıdaki örnekte gösterildiği gibi, eşitlik için kültüre duyarlı bir karşılaştırma, bu iki gösterimin eşit olduğunu gösterir, ancak sıradan bir sıralı karşılaştırma yoktur. Ancak, iki dize normalleştirilirse, sıralı bir karşılaştırma da eşit olduklarını gösterir. (Dizeleri normalleştirme hakkında daha fazla bilgi için bkz. Normalleştirme bölümü.)
using System; using System.Globalization; using System.IO; public class Example5 { public static void Main() { StreamWriter sw = new StreamWriter(@".\graphemes.txt"); string grapheme = "\u0061\u0308"; sw.WriteLine(grapheme); string singleChar = "\u00e4"; sw.WriteLine(singleChar); sw.WriteLine("{0} = {1} (Culture-sensitive): {2}", grapheme, singleChar, String.Equals(grapheme, singleChar, StringComparison.CurrentCulture)); sw.WriteLine("{0} = {1} (Ordinal): {2}", grapheme, singleChar, String.Equals(grapheme, singleChar, StringComparison.Ordinal)); sw.WriteLine("{0} = {1} (Normalized Ordinal): {2}", grapheme, singleChar, String.Equals(grapheme.Normalize(), singleChar.Normalize(), StringComparison.Ordinal)); sw.Close(); } } // The example produces the following output: // ä // ä // ä = ä (Culture-sensitive): True // ä = ä (Ordinal): False // ä = ä (Normalized Ordinal): True
open System open System.IO do use sw = new StreamWriter(@".\graphemes.txt") let grapheme = "\u0061\u0308" sw.WriteLine grapheme let singleChar = "\u00e4" sw.WriteLine singleChar sw.WriteLine("{0} = {1} (Culture-sensitive): {2}", grapheme, singleChar, String.Equals(grapheme, singleChar, StringComparison.CurrentCulture)) sw.WriteLine("{0} = {1} (Ordinal): {2}", grapheme, singleChar, String.Equals(grapheme, singleChar, StringComparison.Ordinal)) sw.WriteLine("{0} = {1} (Normalized Ordinal): {2}", grapheme, singleChar, String.Equals(grapheme.Normalize(), singleChar.Normalize(), StringComparison.Ordinal)) // The example produces the following output: // ä // ä // ä = ä (Culture-sensitive): True // ä = ä (Ordinal): False // ä = ä (Normalized Ordinal): True
Imports System.Globalization Imports System.IO Module Example9 Public Sub Main() Dim sw As New StreamWriter(".\graphemes.txt") Dim grapheme As String = ChrW(&H61) + ChrW(&H308) sw.WriteLine(grapheme) Dim singleChar As String = ChrW(&HE4) sw.WriteLine(singleChar) sw.WriteLine("{0} = {1} (Culture-sensitive): {2}", grapheme, singleChar, String.Equals(grapheme, singleChar, StringComparison.CurrentCulture)) sw.WriteLine("{0} = {1} (Ordinal): {2}", grapheme, singleChar, String.Equals(grapheme, singleChar, StringComparison.Ordinal)) sw.WriteLine("{0} = {1} (Normalized Ordinal): {2}", grapheme, singleChar, String.Equals(grapheme.Normalize(), singleChar.Normalize(), StringComparison.Ordinal)) sw.Close() End Sub End Module ' The example produces the following output: ' ä ' ä ' ä = ä (Culture-sensitive): True ' ä = ä (Ordinal): False ' ä = ä (Normalized Ordinal): True
Unicode tamamlayıcı kod noktası (vekil çift), kod noktası yüksek vekil olan bir Char nesne ve ardından kod noktası düşük vekil olan bir Char nesne tarafından temsil edilir. Yüksek vekil kod birimleri U+D800 ile U+DBFF arasında değişir. Düşük vekil kod birimleri U+DC00 ile U+DFFF arasında değişir. Vekil çiftleri, 16 Unicode ek düzlemindeki karakterleri temsil etmek için kullanılır. Aşağıdaki örnek bir vekil karakter oluşturur ve bunu yönteme Char.IsSurrogatePair(Char, Char) geçirerek vekil çift olup olmadığını belirler.
string surrogate = "\uD800\uDC03"; for (int ctr = 0; ctr < surrogate.Length; ctr++) Console.Write($"U+{(ushort)surrogate[ctr]:X2} "); Console.WriteLine(); Console.WriteLine(" Is Surrogate Pair: {0}", Char.IsSurrogatePair(surrogate[0], surrogate[1])); // The example displays the following output: // U+D800 U+DC03 // Is Surrogate Pair: True
open System let surrogate = "\uD800\uDC03" for i = 0 to surrogate.Length - 1 do printf $"U+{uint16 surrogate[i]:X2} " printfn $"\n Is Surrogate Pair: {Char.IsSurrogatePair(surrogate[0], surrogate[1])}" // The example displays the following output: // U+D800 U+DC03 // Is Surrogate Pair: True
Module Example20 Public Sub Main() Dim surrogate As String = ChrW(&HD800) + ChrW(&HDC03) For ctr As Integer = 0 To surrogate.Length - 1 Console.Write("U+{0:X2} ", Convert.ToUInt16(surrogate(ctr))) Next Console.WriteLine() Console.WriteLine(" Is Surrogate Pair: {0}", Char.IsSurrogatePair(surrogate(0), surrogate(1))) End Sub End Module ' The example displays the following output: ' U+D800 U+DC03 ' Is Surrogate Pair: True
Unicode standardı
Bir dizedeki karakterler, değerlere karşılık gelen Char UTF-16 kodlanmış kod birimleriyle temsil edilir.
Bir dizedeki her karakter, sabit listesi tarafından .NET'te temsil edilen ilişkili bir Unicode karakter kategorisine UnicodeCategory sahiptir. Bir karakterin veya vekil çiftin kategorisi yöntemi çağrılarak CharUnicodeInfo.GetUnicodeCategory belirlenebilir.
.NET kendi karakter tablosunu ve karşılık gelen kategorilerini korur ve bu da farklı platformlarda çalışan bir .NET uygulamasının belirli bir sürümünün aynı karakter kategorisi bilgilerini döndürmesini sağlar. Tüm .NET sürümlerinde ve tüm işletim sistemi platformlarında karakter kategorisi bilgileri Unicode Karakter Veritabanı tarafından sağlanır.
Aşağıdaki tabloda karakter kategorilerinin temel aldığı .NET sürümleri ve Unicode Standart sürümleri listelenmektedir.
.NET sürümü | Unicode Standardının sürümü |
---|---|
.NET Framework 1.1 | Unicode Standart, Sürüm 4.0.0 |
.NET Framework 2.0 | Unicode Standart, Sürüm 5.0.0 |
.NET Framework 3.5 | Unicode Standart, Sürüm 5.0.0 |
.NET Framework 4 | Unicode Standart, Sürüm 5.0.0 |
.NET Framework 4.5 | Unicode Standard, Sürüm 6.3.0 |
.NET Framework 4.5.1 | Unicode Standard, Sürüm 6.3.0 |
.NET Framework 4.5.2 | Unicode Standard, Sürüm 6.3.0 |
.NET Framework 4.6 | Unicode Standard, Sürüm 6.3.0 |
.NET Framework 4.6.1 | Unicode Standard, Sürüm 6.3.0 |
.NET Framework 4.6.2 ve sonraki sürümleri | Unicode Standart, Sürüm 8.0.0 |
.NET Core 2.1 | Unicode Standart, Sürüm 8.0.0 |
.NET Core 3.1 | Unicode Standart, Sürüm 11.0.0 |
.NET 5 | Unicode Standart, Sürüm 13.0.0 |
Buna ek olarak, .NET Unicode standardına göre dize karşılaştırmasını ve sıralamayı destekler. Windows işletim sisteminin Windows 8 ve sonraki sürümlerinde çalışan .NET Framework 4.5'den başlayarak, çalışma zamanı dize karşılaştırma ve sıralama işlemlerini işletim sistemine devreder. .NET Core ve .NET 5+ sürümlerinde, dize karşılaştırma ve sıralama bilgileri Unicode kitaplıkları için Uluslararası Bileşenler tarafından sağlanır (Windows 10 Mayıs 2019 Güncelleştirmesi öncesi Windows sürümleri hariç). Aşağıdaki tabloda karakter karşılaştırma ve sıralamanın temel aldığı .NET sürümleri ve Unicode Standart sürümleri listelenmektedir.
.NET sürümü | Unicode Standardının sürümü |
---|---|
Windows 7'de .NET Framework 4.5 ve üzeri | Unicode Standart, Sürüm 5.0.0 |
Windows 8 ve üzeri Windows işletim sistemlerinde .NET Framework 4.5 ve üzeri | Unicode Standard, Sürüm 6.3.0 |
.NET Core ve .NET 5+ | Temel işletim sistemi tarafından desteklenen Unicode Standardı sürümüne bağlıdır. |
Eklenmiş null karakterler
.NET'te bir String nesne, dize uzunluğunun bir parçası olarak sayılan eklenmiş null karakterler içerebilir. Ancak, C ve C++ gibi bazı dillerde null karakter dizenin sonunu gösterir; dizenin bir parçası olarak kabul edilmez ve dizenin uzunluğunun bir parçası olarak sayılmaz. Bu, C ve C++ programcıları veya C veya C++ ile yazılmış kitaplıkların dizeler hakkında gerçekleştirebileceği aşağıdaki yaygın varsayımların nesnelere String uygulandığında geçerli olması gerekmediği anlamına gelir:
veya
wcslen
işlevleri tarafındanstrlen
döndürülen değer eşit String.Lengtholmayabilir.veya
wcscpy_s
işlevleri tarafındanstrcpy_s
oluşturulan dize, kopyalanan dizeyle aynı olmayabilir.
Nesneleri başlatan String yerel C ve C++ kodunun ve platform aracılığıyla geçirilen nesnelerin çağrıldığından String emin olmanız gerekir; eklenmiş null karakterin dizenin sonunu işaretlediğini varsaymayın.
Dizeye eklenmiş null karakterler, bir dize sıralandığında (veya karşılaştırıldığında) ve bir dize arandığında da farklı kabul edilir. Sabit kültürü kullanan karşılaştırmalar dahil olmak üzere iki dize arasında kültüre duyarlı karşılaştırmalar yapılırken null karakterler yoksayılır. Bunlar yalnızca sıralı veya büyük/küçük harfe duyarlı olmayan sıralı karşılaştırmalar için kabul edilir. Öte yandan, ekli null karakterler, , StartsWithve IndexOfgibi Containsyöntemlerle bir dize aranırken her zaman dikkate alınır.
Dizeler ve dizinler
Dizin, içindeki bir Char nesnenin (Unicode karakteri değil) Stringkonumudur. Dizin, dizedeki ilk konumdan başlayan sıfır tabanlı, olumsuz olmayan bir sayıdır ve dizin konumu sıfırdır. ve LastIndexOfgibi IndexOf bir dizi arama yöntemi, dize örneğindeki bir karakterin veya alt dizenin dizinini döndürür.
özelliği, Chars[] dizedeki dizin konumlarına göre tek tek Char nesnelere erişmenizi sağlar. Chars[] Özelliği varsayılan özellik (Visual Basic'te) veya dizin oluşturucu (C# ve F# içinde) olduğundan, dizedeki tek tek Char nesnelere aşağıdaki gibi bir kod kullanarak erişebilirsiniz. Bu kod, dizenin kaç sözcük içerdiğini belirlemek için dizede boşluk veya noktalama karakterleri arar.
string s1 = "This string consists of a single short sentence.";
int nWords = 0;
s1 = s1.Trim();
for (int ctr = 0; ctr < s1.Length; ctr++) {
if (Char.IsPunctuation(s1[ctr]) | Char.IsWhiteSpace(s1[ctr]))
nWords++;
}
Console.WriteLine("The sentence\n {0}\nhas {1} words.",
s1, nWords);
// The example displays the following output:
// The sentence
// This string consists of a single short sentence.
// has 8 words.
let s1 = "This string consists of a single short sentence."
let mutable nWords = 0
for i = 0 to s1.Length - 1 do
if Char.IsPunctuation s1[i] || Char.IsWhiteSpace s1[i] then
nWords <- nWords + 1
printfn $"The sentence\n {s1}\nhas {nWords} words."
// The example displays the following output:
// The sentence
// This string consists of a single short sentence.
// has 8 words.
Module Example12
Public Sub Main()
Dim s1 As String = "This string consists of a single short sentence."
Dim nWords As Integer = 0
s1 = s1.Trim()
For ctr As Integer = 0 To s1.Length - 1
If Char.IsPunctuation(s1(ctr)) Or Char.IsWhiteSpace(s1(ctr)) Then
nWords += 1
End If
Next
Console.WriteLine("The sentence{2} {0}{2}has {1} words.",
s1, nWords, vbCrLf)
End Sub
End Module
' The example displays the following output:
' The sentence
' This string consists of a single short sentence.
' has 8 words.
String sınıfı arabirimini uyguladığındanIEnumerable, aşağıdaki örnekte gösterildiği gibi bir foreach
yapı kullanarak bir dizedeki nesneler arasında Char yineleme de yapabilirsiniz.
string s1 = "This string consists of a single short sentence.";
int nWords = 0;
s1 = s1.Trim();
foreach (var ch in s1) {
if (Char.IsPunctuation(ch) | Char.IsWhiteSpace(ch))
nWords++;
}
Console.WriteLine("The sentence\n {0}\nhas {1} words.",
s1, nWords);
// The example displays the following output:
// The sentence
// This string consists of a single short sentence.
// has 8 words.
let s1 = "This string consists of a single short sentence."
let mutable nWords = 0
for ch in s1 do
if Char.IsPunctuation ch || Char.IsWhiteSpace ch then
nWords <- nWords + 1
printfn $"The sentence\n {s1}\nhas {nWords} words."
// The example displays the following output:
// The sentence
// This string consists of a single short sentence.
// has 8 words.
Module Example13
Public Sub Main()
Dim s1 As String = "This string consists of a single short sentence."
Dim nWords As Integer = 0
s1 = s1.Trim()
For Each ch In s1
If Char.IsPunctuation(ch) Or Char.IsWhiteSpace(ch) Then
nWords += 1
End If
Next
Console.WriteLine("The sentence{2} {0}{2}has {1} words.",
s1, nWords, vbCrLf)
End Sub
End Module
' The example displays the following output:
' The sentence
' This string consists of a single short sentence.
' has 8 words.
Ardışık dizin değerleri ardışık Unicode karakterlerine karşılık gelmeyebilir çünkü Unicode karakteri birden Char fazla nesne olarak kodlanmış olabilir. Özellikle, bir dize, bir veya daha fazla birleştirme karakteri veya vekil çiftler tarafından temel karakter tarafından oluşturulan çok karakterli metin birimleri içerebilir. Nesneler yerine Char Unicode karakterlerle çalışmak için ve TextElementEnumerator sınıflarını System.Globalization.StringInfo veya String.EnumerateRunes yöntemini ve Rune yapısını kullanın. Aşağıdaki örnekte, nesnelerle çalışan kod ile Unicode karakterleriyle Char çalışan kod arasındaki fark gösterilmektedir. Tümcenin her sözcüğündeki karakter veya metin öğelerinin sayısını karşılaştırır. Dize, bir temel karakterin iki dizisini ve ardından bir birleştirme karakterini içerir.
// First sentence of The Mystery of the Yellow Room, by Leroux.
string opening = "Ce n'est pas sans une certaine émotion que "+
"je commence à raconter ici les aventures " +
"extraordinaires de Joseph Rouletabille.";
// Character counters.
int nChars = 0;
// Objects to store word count.
List<int> chars = new List<int>();
List<int> elements = new List<int>();
foreach (var ch in opening) {
// Skip the ' character.
if (ch == '\u0027') continue;
if (Char.IsWhiteSpace(ch) | (Char.IsPunctuation(ch))) {
chars.Add(nChars);
nChars = 0;
}
else {
nChars++;
}
}
System.Globalization.TextElementEnumerator te =
System.Globalization.StringInfo.GetTextElementEnumerator(opening);
while (te.MoveNext()) {
string s = te.GetTextElement();
// Skip the ' character.
if (s == "\u0027") continue;
if ( String.IsNullOrEmpty(s.Trim()) | (s.Length == 1 && Char.IsPunctuation(Convert.ToChar(s)))) {
elements.Add(nChars);
nChars = 0;
}
else {
nChars++;
}
}
// Display character counts.
Console.WriteLine("{0,6} {1,20} {2,20}",
"Word #", "Char Objects", "Characters");
for (int ctr = 0; ctr < chars.Count; ctr++)
Console.WriteLine("{0,6} {1,20} {2,20}",
ctr, chars[ctr], elements[ctr]);
// The example displays the following output:
// Word # Char Objects Characters
// 0 2 2
// 1 4 4
// 2 3 3
// 3 4 4
// 4 3 3
// 5 8 8
// 6 8 7
// 7 3 3
// 8 2 2
// 9 8 8
// 10 2 1
// 11 8 8
// 12 3 3
// 13 3 3
// 14 9 9
// 15 15 15
// 16 2 2
// 17 6 6
// 18 12 12
open System
open System.Globalization
// First sentence of The Mystery of the Yellow Room, by Leroux.
let opening = "Ce n'est pas sans une certaine émotion que je commence à raconter ici les aventures extraordinaires de Joseph Rouletabille."
// Character counters.
let mutable nChars = 0
// Objects to store word count.
let chars = ResizeArray<int>()
let elements = ResizeArray<int>()
for ch in opening do
// Skip the ' character.
if ch <> '\u0027' then
if Char.IsWhiteSpace ch || Char.IsPunctuation ch then
chars.Add nChars
nChars <- 0
else
nChars <- nChars + 1
let te = StringInfo.GetTextElementEnumerator opening
while te.MoveNext() do
let s = te.GetTextElement()
// Skip the ' character.
if s <> "\u0027" then
if String.IsNullOrEmpty(s.Trim()) || (s.Length = 1 && Char.IsPunctuation(Convert.ToChar s)) then
elements.Add nChars
nChars <- 0
else
nChars <- nChars + 1
// Display character counts.
printfn "%6s %20s %20s" "Word #" "Char Objects " "Characters"
for i = 0 to chars.Count - 1 do
printfn "%6d %20d %20d" i chars[i] elements[i]
// The example displays the following output:
// Word # Char Objects Characters
// 0 2 2
// 1 4 4
// 2 3 3
// 3 4 4
// 4 3 3
// 5 8 8
// 6 8 7
// 7 3 3
// 8 2 2
// 9 8 8
// 10 2 1
// 11 8 8
// 12 3 3
// 13 3 3
// 14 9 9
// 15 15 15
// 16 2 2
// 17 6 6
// 18 12 12
Imports System.Collections.Generic
Imports System.Globalization
Module Example14
Public Sub Main()
' First sentence of The Mystery of the Yellow Room, by Leroux.
Dim opening As String = "Ce n'est pas sans une certaine émotion que " +
"je commence à raconter ici les aventures " +
"extraordinaires de Joseph Rouletabille."
' Character counters.
Dim nChars As Integer = 0
' Objects to store word count.
Dim chars As New List(Of Integer)()
Dim elements As New List(Of Integer)()
For Each ch In opening
' Skip the ' character.
If ch = ChrW(&H27) Then Continue For
If Char.IsWhiteSpace(ch) Or Char.IsPunctuation(ch) Then
chars.Add(nChars)
nChars = 0
Else
nChars += 1
End If
Next
Dim te As TextElementEnumerator = StringInfo.GetTextElementEnumerator(opening)
Do While te.MoveNext()
Dim s As String = te.GetTextElement()
' Skip the ' character.
If s = ChrW(&H27) Then Continue Do
If String.IsNullOrEmpty(s.Trim()) Or (s.Length = 1 AndAlso Char.IsPunctuation(Convert.ToChar(s))) Then
elements.Add(nChars)
nChars = 0
Else
nChars += 1
End If
Loop
' Display character counts.
Console.WriteLine("{0,6} {1,20} {2,20}",
"Word #", "Char Objects", "Characters")
For ctr As Integer = 0 To chars.Count - 1
Console.WriteLine("{0,6} {1,20} {2,20}",
ctr, chars(ctr), elements(ctr))
Next
End Sub
End Module
' The example displays the following output:
' Word # Char Objects Characters
' 0 2 2
' 1 4 4
' 2 3 3
' 3 4 4
' 4 3 3
' 5 8 8
' 6 8 7
' 7 3 3
' 8 2 2
' 9 8 8
' 10 2 1
' 11 8 8
' 12 3 3
' 13 3 3
' 14 9 9
' 15 15 15
' 16 2 2
' 17 6 6
' 18 12 12
Bu örnek, bir dizedeki StringInfo.GetTextElementEnumerator tüm metin öğelerini numaralandırmak için yöntemini ve TextElementEnumerator sınıfını kullanarak metin öğeleriyle birlikte çalışır. Yöntemini çağırarak StringInfo.ParseCombiningCharacters her metin öğesinin başlangıç dizinini içeren bir dizi de alabilirsiniz.
Tek tek Char değerler yerine metin birimleriyle çalışma hakkında daha fazla bilgi için bkz . .NET'te karakter kodlamaya giriş.
Null dizeler ve boş dizeler
Bildirilmiş ancak değer atanmamış bir dize şeklindedir null
. Bu dizede yöntemler çağrılmaya çalışılması bir NullReferenceExceptionoluşturur. Null dize, değeri "" veya String.Emptyolan bir dize olan boş dizeden farklıdır. Bazı durumlarda, bir yöntem çağrısında bağımsız değişken olarak null dize veya boş bir dize geçirmek bir özel durum oluşturur. Örneğin, yöntemine Int32.Parse null dize geçirilmesi bir ArgumentNullExceptionoluşturur ve boş bir dize geçirerek bir FormatExceptionoluşturur. Diğer durumlarda, yöntem bağımsız değişkeni null dize veya boş dize olabilir. Örneğin, bir sınıf için bir IFormattable uygulama sağlıyorsanız, hem null dize hem de boş bir dizeyi genel ("G") biçim tanımlayıcısıyla eşitlersiniz.
sınıfı, String bir dizenin null
boş olup olmadığını test etmenizi sağlayan aşağıdaki iki kolaylık yöntemini içerir:
IsNullOrEmpty, bir dizenin veya
null
değerine eşit String.Emptyolup olmadığını gösterir. Bu yöntem, aşağıdaki gibi bir kod kullanma gereksinimini ortadan kaldırır:if (str == null || str.Equals(String.Empty))
if str = null || str.Equals String.Empty then
If str Is Nothing OrElse str.Equals(String.Empty) Then
IsNullOrWhiteSpace, dizenin
null
, eşittir String.Emptyveya yalnızca boşluk karakterlerinden oluşup oluşmadığını gösterir. Bu yöntem, aşağıdaki gibi bir kod kullanma gereksinimini ortadan kaldırır:if (str == null || str.Equals(String.Empty) || str.Trim().Equals(String.Empty))
if str = null || str.Equals String.Empty || str.Trim().Equals String.Empty then
If str Is Nothing OrElse str.Equals(String.Empty) OrElse str.Trim().Equals(String.Empty) Then
Aşağıdaki örnek, özel Temperature
bir sınıfın IFormattable.ToString uygulanmasında yöntemini kullanırIsNullOrEmpty. yöntemi "G", "C", "F" ve "K" biçim dizelerini destekler. Boş bir biçim dizesi veya değeri null
yöntemine geçirilen bir biçim dizesiyse, değeri "G" biçim dizesi olarak değiştirilir.
public string ToString(string format, IFormatProvider provider)
{
if (String.IsNullOrEmpty(format)) format = "G";
if (provider == null) provider = CultureInfo.CurrentCulture;
switch (format.ToUpperInvariant())
{
// Return degrees in Celsius.
case "G":
case "C":
return temp.ToString("F2", provider) + "°C";
// Return degrees in Fahrenheit.
case "F":
return (temp * 9 / 5 + 32).ToString("F2", provider) + "°F";
// Return degrees in Kelvin.
case "K":
return (temp + 273.15).ToString();
default:
throw new FormatException(
String.Format("The {0} format string is not supported.",
format));
}
}
member _.ToString(format: string, provider: IFormatProvider) =
let format =
if String.IsNullOrEmpty format then "G" else format
let provider: IFormatProvider =
if provider = null then CultureInfo.CurrentCulture else provider
match format.ToUpperInvariant() with
// Return degrees in Celsius.
| "G"
| "C" ->
temp.ToString("F2", provider) + "°C"
// Return degrees in Fahrenheit.
| "F" ->
(temp * 9. / 5. + 32.).ToString("F2", provider) + "°F"
// Return degrees in Kelvin.
| "K" ->
(temp + 273.15).ToString()
| _ ->
raise (FormatException(String.Format("The {0} format string is not supported.",format)))
Public Overloads Function ToString(fmt As String, provider As IFormatProvider) As String _
Implements IFormattable.ToString
If String.IsNullOrEmpty(fmt) Then fmt = "G"
If provider Is Nothing Then provider = CultureInfo.CurrentCulture
Select Case fmt.ToUpperInvariant()
' Return degrees in Celsius.
Case "G", "C"
Return temp.ToString("F2", provider) + "°C"
' Return degrees in Fahrenheit.
Case "F"
Return (temp * 9 / 5 + 32).ToString("F2", provider) + "°F"
' Return degrees in Kelvin.
Case "K"
Return (temp + 273.15).ToString()
Case Else
Throw New FormatException(
String.Format("The {0} format string is not supported.",
fmt))
End Select
End Function
Değişmezlik ve StringBuilder sınıfı
Bir String nesne sabit (salt okunur) olarak adlandırılır, çünkü değeri oluşturulduktan sonra değiştirilemez. Bir String nesneyi değiştirmek için görünen yöntemler aslında değişikliği içeren yeni String bir nesne döndürür.
Dizeler sabit olduğundan, tek bir dize gibi görünen öğelere yinelenen eklemeler veya silmeler gerçekleştiren dize işleme yordamları önemli bir performans cezasına neden olabilir. Örneğin, aşağıdaki kod rastgele bir sayı oluşturucu kullanarak 0x052F için 0x0001 aralığında 1000 karakter içeren bir dize oluşturur. Kod, adlı str
mevcut dizeye yeni bir karakter eklemek için dize birleştirmeyi kullanıyor gibi görünse de, aslında her birleştirme işlemi için yeni String bir nesne oluşturur.
using System;
using System.IO;
using System.Text;
public class Example6
{
public static void Main()
{
Random rnd = new Random();
string str = String.Empty;
StreamWriter sw = new StreamWriter(@".\StringFile.txt",
false, Encoding.Unicode);
for (int ctr = 0; ctr <= 1000; ctr++) {
str += (char)rnd.Next(1, 0x0530);
if (str.Length % 60 == 0)
str += Environment.NewLine;
}
sw.Write(str);
sw.Close();
}
}
open System
open System.IO
open System.Text
do
let rnd = Random()
let mutable str = String.Empty
use sw = new StreamWriter(@".\StringFile.txt", false, Encoding.Unicode)
for _ = 0 to 1000 do
str <- str + (rnd.Next(1, 0x0530) |> char |> string)
if str.Length % 60 = 0 then
str <- str + Environment.NewLine
sw.Write str
Imports System.IO
Imports System.Text
Module Example10
Public Sub Main()
Dim rnd As New Random()
Dim str As String = String.Empty
Dim sw As New StreamWriter(".\StringFile.txt",
False, Encoding.Unicode)
For ctr As Integer = 0 To 1000
str += ChrW(rnd.Next(1, &H530))
If str.Length Mod 60 = 0 Then str += vbCrLf
Next
sw.Write(str)
sw.Close()
End Sub
End Module
Bir dizenin StringBuilder değerinde birden çok değişiklik yapılan işlemler için sınıfı yerine String sınıfını kullanabilirsiniz. Sınıfın String örneklerinden farklı olarak, StringBuilder nesneler değişebilir; bir dizeden alt dizeleri birleştirdiğinizde, eklediğinizde veya sildiğinizde, işlemler tek bir dizede gerçekleştirilir. Bir StringBuilder nesnenin değerini değiştirmeyi bitirdiğinizde, nesnesini dizeye dönüştürmek için yöntemini çağırabilirsiniz StringBuilder.ToString . Aşağıdaki örnek, bir nesneyle StringBuilder 0x052F 0x0001 için aralıktaki 1000 rastgele karakteri birleştirmek için önceki örnekte kullanılan öğesinin yerini alırString.
using System;
using System.IO;
using System.Text;
public class Example10
{
public static void Main()
{
Random rnd = new Random();
StringBuilder sb = new StringBuilder();
StreamWriter sw = new StreamWriter(@".\StringFile.txt",
false, Encoding.Unicode);
for (int ctr = 0; ctr <= 1000; ctr++) {
sb.Append((char)rnd.Next(1, 0x0530));
if (sb.Length % 60 == 0)
sb.AppendLine();
}
sw.Write(sb.ToString());
sw.Close();
}
}
open System
open System.IO
open System.Text
do
let rnd = Random()
let sb = StringBuilder()
use sw = new StreamWriter(@".\StringFile.txt", false, Encoding.Unicode)
for _ = 0 to 1000 do
sb.Append(rnd.Next(1, 0x0530) |> char) |> ignore
if sb.Length % 60 = 0 then
sb.AppendLine() |> ignore
sw.Write(string sb)
Imports System.IO
Imports System.Text
Module Example11
Public Sub Main()
Dim rnd As New Random()
Dim sb As New StringBuilder()
Dim sw As New StreamWriter(".\StringFile.txt",
False, Encoding.Unicode)
For ctr As Integer = 0 To 1000
sb.Append(ChrW(rnd.Next(1, &H530)))
If sb.Length Mod 60 = 0 Then sb.AppendLine()
Next
sw.Write(sb.ToString())
sw.Close()
End Sub
End Module
Sıra ve kültüre duyarlı işlemlerin karşılaştırılması
Sınıfın String üyeleri bir String nesne üzerinde sıralı veya kültüre duyarlı (dilbilimsel) işlemler gerçekleştirir. Sıralı bir işlem, her Char nesnenin sayısal değeri üzerinde çalışır. Kültüre duyarlı bir işlem nesnenin String değerine göre hareket eder ve kültüre özgü büyük/küçük harf, sıralama, biçimlendirme ve ayrıştırma kurallarını dikkate alır. Kültüre duyarlı işlemler açıkça bildirilen bir kültür veya örtük geçerli kültür bağlamında yürütülür. İki tür işlem, aynı dizede gerçekleştirildiğinde çok farklı sonuçlar üretebilir.
.NET ayrıca, bölgeden bağımsız olarak İngilizce dilinin kültür ayarlarını temel alan sabit kültürü ()CultureInfo.InvariantCulture kullanarak kültüre duyarsız dil dizesi işlemlerini de destekler. Diğer System.Globalization.CultureInfo ayarlardan farklı olarak, sabit kültürün ayarlarının sistemden sisteme ve .NET sürümleri arasında tek bir bilgisayarda tutarlı kalacağı garanti edilir. Sabit kültür, tüm kültürlerde dize karşılaştırmalarının ve sıralamanın kararlılığını sağlayan bir tür kara kutu olarak görülebilir.
Önemli
Uygulamanız, dosya adı veya adlandırılmış kanal gibi simgesel bir tanımlayıcı veya XML dosyasındaki metin tabanlı veriler gibi kalıcı veriler hakkında güvenlik kararı verirse, işlem kültüre duyarlı karşılaştırma yerine sıralı bir karşılaştırma kullanmalıdır. Bunun nedeni kültüre duyarlı karşılaştırmanın, kültüre bağlı olarak farklı sonuçlar verebiliyor olması, sıralı karşılaştırmanın ise yalnızca karşılaştırılan karakterlerin ikili değerine bağlı olmasıdır.
Önemli
Dize işlemlerini gerçekleştiren yöntemlerin çoğu, yönteminin sıralı veya kültüre duyarlı bir işlem gerçekleştirip gerçekleştirmediğini belirtmenize olanak tanıyan türünde StringComparisonbir parametresi olan bir aşırı yükleme içerir. Genel olarak, yöntem çağrınızın amacını net hale getirmek için bu aşırı yüklemeyi çağırmanız gerekir. Dizelerde sıra ve kültüre duyarlı işlemleri kullanmaya yönelik en iyi yöntemler ve yönergeler için bkz . Dizeleri Kullanmak için En İyi Yöntemler.
Büyük/küçük harfe ayırma, ayrıştırma ve biçimlendirme, karşılaştırma ve sıralama işlemleri ile eşitlik için test işlemleri sıralı veya kültüre duyarlı olabilir. Aşağıdaki bölümlerde her işlem kategorisi açıklanmıştır.
İpucu
Her zaman yöntem çağrınızın amacını net hale getiren bir yöntem aşırı yüklemesini çağırmalısınız. Örneğin, geçerli kültürün Compare(String, String) kurallarını kullanarak iki dizenin kültüre duyarlı karşılaştırmasını gerçekleştirmek için yöntemini çağırmak yerine, yöntemini bağımsız değişken için comparisonType
değeriyle StringComparison.CurrentCulture çağırmanız Compare(String, String, StringComparison) gerekir. Daha fazla bilgi için bkz . Dizeleri Kullanmak için En İyi Yöntemler.
Sıralama ve karşılaştırma işlemlerinde kullanılan karakter ağırlıkları hakkında bilgi içeren bir dizi metin dosyası olan sıralama ağırlığı tablolarını aşağıdaki bağlantılardan indirebilirsiniz:
- Windows (.NET Framework ve .NET Core): Ağırlık Tablolarını Sıralama
- Windows 10 Mayıs 2019 Güncelleştirmesi veya üzeri (.NET 5+) ve Linux ve macOS (.NET Core ve .NET 5+): Varsayılan Unicode Harmanlama Öğesi Tablosu
Büyük/Küçük Harf Kullanımı
Büyük/küçük harf kuralları, Unicode karakterinin büyük harfe çevirmesinin nasıl değiştirileceğini belirler; örneğin, küçük harften büyük harfe. Genellikle, bir büyük/küçük harfe dönüştürme işlemi bir dize karşılaştırması öncesinde gerçekleştirilir. Örneğin, bir dize başka bir büyük harf dizesiyle karşılaştırılabilmesi için büyük harfe dönüştürülebilir. veya yöntemini çağırarak ToLower bir dizedeki karakterleri küçük harfe dönüştürebilir ve veya ToLowerInvariant ToUpperInvariant yöntemini çağırarak ToUpper bunları büyük harfe dönüştürebilirsiniz. Ayrıca, bir dizeyi TextInfo.ToTitleCase büyük/küçük harfe dönüştürmek için yöntemini kullanabilirsiniz.
Not
Yalnızca Linux ve macOS sistemlerinde çalışan .NET Core: C ve Posix kültürleri için harmanlama davranışı her zaman büyük/küçük harfe duyarlıdır çünkü bu kültürler beklenen Unicode harmanlama sırasını kullanmaz. Kültüre duyarlı, büyük/küçük harfe duyarlı olmayan sıralama işlemleri gerçekleştirmek için C veya Posix dışında bir kültür kullanmanızı öneririz.
Büyük/küçük harf işlemleri geçerli kültürün, belirtilen kültürün veya sabit kültürün kurallarını temel alabilir. Büyük/küçük harf eşlemeleri kullanılan kültüre bağlı olarak değişebileceğinden, büyük/küçük harf işlemlerinin sonucu kültüre göre farklılık gösterebilir. Büyük/küçük harf arasındaki gerçek farklar üç türdedir:
LATIN BÜYÜK HARF I (U+0049), LATIN KÜÇÜK HARF I (U+0069), ÜSTÜNDE NOKTA BULUNAN LATIN BÜYÜK HARF I (U+0130) ve LATIN KÜÇÜK HARF NOKTASIZ I (U+0131) eşlemesindeki farklar. tr-TR (Türkçe (Türkiye)) ve az-Latn-AZ (Azerbaycan, Latin) kültürlerinde ve tr, az ve az-Latn nötr kültürlerinde, LATIN BÜYÜK HARF I'nin küçük eşdeğeri LATIN KÜÇÜK HARF NOKTASIZ I, LATIN KÜÇÜK HARF I'nin büyük eşdeğeri ISE LATIN BÜYÜK HARF I, ÜSTÜNDE NOKTA OLAN LATIN BÜYÜK HARF I'dir. Sabit kültür de dahil olmak üzere diğer tüm kültürlerde LATIN KÜÇÜK HARF I ve LATIN BÜYÜK HARF I küçük ve büyük harf eşdeğerleridir.
Aşağıdaki örnekte, kültüre duyarlı büyük/küçük harf karşılaştırmasına bağlıysa dosya sistemi erişimini önlemek için tasarlanmış bir dize karşılaştırmasının nasıl başarısız olabileceği gösterilmektedir. (Sabit kültürün büyük/küçük harf kuralları kullanılmış olmalıdır.)
using System; using System.Globalization; using System.Threading; public class Example1 { const string disallowed = "file"; public static void Main() { IsAccessAllowed(@"FILE:\\\c:\users\user001\documents\FinancialInfo.txt"); } private static void IsAccessAllowed(String resource) { CultureInfo[] cultures = { CultureInfo.CreateSpecificCulture("en-US"), CultureInfo.CreateSpecificCulture("tr-TR") }; String scheme = null; int index = resource.IndexOfAny( new Char[] { '\\', '/' } ); if (index > 0) scheme = resource.Substring(0, index - 1); // Change the current culture and perform the comparison. foreach (var culture in cultures) { Thread.CurrentThread.CurrentCulture = culture; Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName); Console.WriteLine(resource); Console.WriteLine("Access allowed: {0}", ! String.Equals(disallowed, scheme, StringComparison.CurrentCultureIgnoreCase)); Console.WriteLine(); } } } // The example displays the following output: // Culture: English (United States) // FILE:\\\c:\users\user001\documents\FinancialInfo.txt // Access allowed: False // // Culture: Turkish (Turkey) // FILE:\\\c:\users\user001\documents\FinancialInfo.txt // Access allowed: True
open System open System.Globalization open System.Threading let disallowed = "file" let isAccessAllowed (resource: string) = let cultures = [| CultureInfo.CreateSpecificCulture "en-US" CultureInfo.CreateSpecificCulture "tr-TR" |] let index = resource.IndexOfAny [| '\\'; '/' |] let scheme = if index > 0 then resource.Substring(0, index - 1) else null // Change the current culture and perform the comparison. for culture in cultures do Thread.CurrentThread.CurrentCulture <- culture printfn $"Culture: {CultureInfo.CurrentCulture.DisplayName}" printfn $"{resource}" printfn $"Access allowed: {String.Equals(disallowed, scheme, StringComparison.CurrentCultureIgnoreCase) |> not}" printfn "" isAccessAllowed @"FILE:\\\c:\users\user001\documents\FinancialInfo.txt" // The example displays the following output: // Culture: English (United States) // FILE:\\\c:\users\user001\documents\FinancialInfo.txt // Access allowed: False // // Culture: Turkish (Turkey) // FILE:\\\c:\users\user001\documents\FinancialInfo.txt // Access allowed: True
Imports System.Globalization Imports System.Threading Module Example2 Const disallowed = "file" Public Sub Main() IsAccessAllowed("FILE:\\\c:\users\user001\documents\FinancialInfo.txt") End Sub Private Sub IsAccessAllowed(resource As String) Dim cultures() As CultureInfo = {CultureInfo.CreateSpecificCulture("en-US"), CultureInfo.CreateSpecificCulture("tr-TR")} Dim scheme As String = Nothing Dim index As Integer = resource.IndexOfAny({"\"c, "/"c}) If index > 0 Then scheme = resource.Substring(0, index - 1) ' Change the current culture and perform the comparison. For Each culture In cultures Thread.CurrentThread.CurrentCulture = culture Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName) Console.WriteLine(resource) Console.WriteLine("Access allowed: {0}", Not String.Equals(disallowed, scheme, StringComparison.CurrentCultureIgnoreCase)) Console.WriteLine() Next End Sub End Module ' The example displays the following output: ' Culture: English (United States) ' FILE:\\\c:\users\user001\documents\FinancialInfo.txt ' Access allowed: False ' ' Culture: Turkish (Turkey) ' FILE:\\\c:\users\user001\documents\FinancialInfo.txt ' Access allowed: True
Sabit kültür ve diğer tüm kültürler arasındaki büyük/küçük harf eşlemelerindeki farklar. Böyle durumlarda, bir karakteri büyük veya küçük harfe dönüştürmek için sabit kültürün büyük/küçük harf kurallarının kullanılması aynı karakteri döndürür. Diğer tüm kültürler için farklı bir karakter döndürür. Etkilenen karakterlerden bazıları aşağıdaki tabloda listelenmiştir.
Karakter Olarak değiştirilirse Döndürülenler MIKRON İŞARETI (U+00B5) Büyük harfe YUNANCA BÜYÜK HARF MU (U+-39C) ÜSTÜNDE NOKTA BULUNAN LATIN BÜYÜK I HARFI (U+0130) Küçük harf LATIN KÜÇÜK HARF I (U+0069) LATIN KÜÇÜK HARF NOKTASıZ I (U+0131) Büyük harfe LATIN BÜYÜK HARF I (U+0049) LATIN KÜÇÜK HARF UZUN S (U+017F) Büyük harfe LATIN BÜYÜK S HARFI (U+0053) KÜÇÜK HARF Z VE CARON IÇEREN LATIN BÜYÜK D HARFI (U+01C5) Küçük harf LATIN KÜÇÜK HARF DZ WITH CARON (U+01C6) YUNAN YPOGEGRAMMENI'SINI BIRLEŞTIRME (U+0345) Büyük harfe YUNANCA BÜYÜK HARF IOTA (U+0399) ASCII karakter aralığındaki iki harfli karma büyük/küçük harf çiftlerinin büyük/küçük harf eşlemelerindeki farklar. Çoğu kültürde, iki harfli bir karma harf çifti eşdeğer iki harfli büyük veya küçük harf çiftine eşittir. Bu, aşağıdaki kültürlerdeki aşağıdaki iki harfli çiftler için geçerli değildir, çünkü her durumda bunlar bir digraph ile karşılaştırılır:
- hr-HR (Hırvatistan) kültüründe "lJ" ve "nJ".
- cs-CZ (Çek Cumhuriyeti) ve sk-SK (Slovakya)) kültürlerinde "cH".
- da-DK (Danca (Danimarka)) kültüründe "aA".
- hu-HU (Macarca (Macaristan)) kültüründe "cS", "dZ", "dZS", "nY", "sZ", "tY" ve "zS".
- es-ES_tradnl (İspanyolca (İspanya, Geleneksel Sıralama)) kültüründe "cH" ve "lL".
- vi-VN (Vietnamca (Vietnam) kültüründe "cH", "gI", "kH", "nG" "nH", "pH", "qU', "tH" ve "tR".
Ancak, bu çiftlerin kültüre duyarlı bir karşılaştırmasının sorun oluşturduğu bir durumla karşılaşmak olağan dışıdır, çünkü bu çiftler sabit dizelerde veya tanımlayıcılarda nadirdir.
Aşağıdaki örnek, dizeleri büyük harfe dönüştürürken kültürler arasındaki büyük/küçük harf kurallarındaki farklardan bazılarını göstermektedir.
using System;
using System.Globalization;
using System.IO;
public class Example
{
public static void Main()
{
StreamWriter sw = new StreamWriter(@".\case.txt");
string[] words = { "file", "sıfır", "Dženana" };
CultureInfo[] cultures = { CultureInfo.InvariantCulture,
new CultureInfo("en-US"),
new CultureInfo("tr-TR") };
foreach (var word in words) {
sw.WriteLine("{0}:", word);
foreach (var culture in cultures) {
string name = String.IsNullOrEmpty(culture.Name) ?
"Invariant" : culture.Name;
string upperWord = word.ToUpper(culture);
sw.WriteLine(" {0,10}: {1,7} {2, 38}", name,
upperWord, ShowHexValue(upperWord));
}
sw.WriteLine();
}
sw.Close();
}
private static string ShowHexValue(string s)
{
string retval = null;
foreach (var ch in s) {
byte[] bytes = BitConverter.GetBytes(ch);
retval += String.Format("{0:X2} {1:X2} ", bytes[1], bytes[0]);
}
return retval;
}
}
// The example displays the following output:
// file:
// Invariant: FILE 00 46 00 49 00 4C 00 45
// en-US: FILE 00 46 00 49 00 4C 00 45
// tr-TR: FİLE 00 46 01 30 00 4C 00 45
//
// sıfır:
// Invariant: SıFıR 00 53 01 31 00 46 01 31 00 52
// en-US: SIFIR 00 53 00 49 00 46 00 49 00 52
// tr-TR: SIFIR 00 53 00 49 00 46 00 49 00 52
//
// Dženana:
// Invariant: DžENANA 01 C5 00 45 00 4E 00 41 00 4E 00 41
// en-US: DŽENANA 01 C4 00 45 00 4E 00 41 00 4E 00 41
// tr-TR: DŽENANA 01 C4 00 45 00 4E 00 41 00 4E 00 41
open System
open System.Globalization
open System.IO
let showHexValue (s: string) =
let mutable retval = ""
for ch in s do
let bytes = BitConverter.GetBytes ch
retval <- retval + String.Format("{0:X2} {1:X2} ", bytes[1], bytes[0])
retval
do
use sw = new StreamWriter(@".\case.txt")
let words = [| "file"; "sıfır"; "Dženana" |]
let cultures =
[| CultureInfo.InvariantCulture
CultureInfo "en-US"
CultureInfo "tr-TR" |]
for word in words do
sw.WriteLine("{0}:", word)
for culture in cultures do
let name =
if String.IsNullOrEmpty culture.Name then "Invariant" else culture.Name
let upperWord = word.ToUpper culture
sw.WriteLine(" {0,10}: {1,7} {2, 38}", name, upperWord, showHexValue upperWord)
sw.WriteLine()
sw.Close()
// The example displays the following output:
// file:
// Invariant: FILE 00 46 00 49 00 4C 00 45
// en-US: FILE 00 46 00 49 00 4C 00 45
// tr-TR: FİLE 00 46 01 30 00 4C 00 45
//
// sıfır:
// Invariant: SıFıR 00 53 01 31 00 46 01 31 00 52
// en-US: SIFIR 00 53 00 49 00 46 00 49 00 52
// tr-TR: SIFIR 00 53 00 49 00 46 00 49 00 52
//
// Dženana:
// Invariant: DžENANA 01 C5 00 45 00 4E 00 41 00 4E 00 41
// en-US: DŽENANA 01 C4 00 45 00 4E 00 41 00 4E 00 41
// tr-TR: DŽENANA 01 C4 00 45 00 4E 00 41 00 4E 00 41
Imports System.Globalization
Imports System.IO
Module Example1
Public Sub Main()
Dim sw As New StreamWriter(".\case.txt")
Dim words As String() = {"file", "sıfır", "Dženana"}
Dim cultures() As CultureInfo = {CultureInfo.InvariantCulture,
New CultureInfo("en-US"),
New CultureInfo("tr-TR")}
For Each word In words
sw.WriteLine("{0}:", word)
For Each culture In cultures
Dim name As String = If(String.IsNullOrEmpty(culture.Name),
"Invariant", culture.Name)
Dim upperWord As String = word.ToUpper(culture)
sw.WriteLine(" {0,10}: {1,7} {2, 38}", name,
upperWord, ShowHexValue(upperWord))
Next
sw.WriteLine()
Next
sw.Close()
End Sub
Private Function ShowHexValue(s As String) As String
Dim retval As String = Nothing
For Each ch In s
Dim bytes() As Byte = BitConverter.GetBytes(ch)
retval += String.Format("{0:X2} {1:X2} ", bytes(1), bytes(0))
Next
Return retval
End Function
End Module
' The example displays the following output:
' file:
' Invariant: FILE 00 46 00 49 00 4C 00 45
' en-US: FILE 00 46 00 49 00 4C 00 45
' tr-TR: FİLE 00 46 01 30 00 4C 00 45
'
' sıfır:
' Invariant: SıFıR 00 53 01 31 00 46 01 31 00 52
' en-US: SIFIR 00 53 00 49 00 46 00 49 00 52
' tr-TR: SIFIR 00 53 00 49 00 46 00 49 00 52
'
' Dženana:
' Invariant: DžENANA 01 C5 00 45 00 4E 00 41 00 4E 00 41
' en-US: DŽENANA 01 C4 00 45 00 4E 00 41 00 4E 00 41
' tr-TR: DŽENANA 01 C4 00 45 00 4E 00 41 00 4E 00 41
Ayrıştırma ve biçimlendirme
Biçimlendirme ve ayrıştırma ters işlemlerdir. Biçimlendirme kuralları, tarih ve saat veya sayı gibi bir değerin dize gösterimine nasıl dönüştürüleceğini belirlerken, ayrıştırma kuralları bir dize gösteriminin tarih ve saat gibi bir değere nasıl dönüştürüleceğini belirler. Hem biçimlendirme hem de ayrıştırma kuralları kültürel kurallara bağlıdır. Aşağıdaki örnekte kültüre özgü bir tarih dizesi yorumlandığında ortaya çıkabilecek belirsizlik gösterilmektedir. Tarih dizesi oluşturmak için kullanılan kültürün kurallarını bilmeden, 03/01/2011, 1/3/2011 ve 01/03/2011'in 3 Ocak 2011'i mi yoksa 1 Mart 2011'i mi temsil ettiğini bilmek mümkün değildir.
using System;
using System.Globalization;
public class Example9
{
public static void Main()
{
DateTime date = new DateTime(2011, 3, 1);
CultureInfo[] cultures = { CultureInfo.InvariantCulture,
new CultureInfo("en-US"),
new CultureInfo("fr-FR") };
foreach (var culture in cultures)
Console.WriteLine("{0,-12} {1}", String.IsNullOrEmpty(culture.Name) ?
"Invariant" : culture.Name,
date.ToString("d", culture));
}
}
// The example displays the following output:
// Invariant 03/01/2011
// en-US 3/1/2011
// fr-FR 01/03/2011
open System
open System.Globalization
let date = DateTime(2011, 3, 1)
let cultures =
[| CultureInfo.InvariantCulture
CultureInfo "en-US"
CultureInfo "fr-FR" |]
for culture in cultures do
printfn $"""{(if String.IsNullOrEmpty culture.Name then "Invariant" else culture.Name),-12} {date.ToString("d", culture)}"""
// The example displays the following output:
// Invariant 03/01/2011
// en-US 3/1/2011
// fr-FR 01/03/2011
Imports System.Globalization
Module Example8
Public Sub Main()
Dim dat As Date = #3/1/2011#
Dim cultures() As CultureInfo = {CultureInfo.InvariantCulture,
New CultureInfo("en-US"),
New CultureInfo("fr-FR")}
For Each culture In cultures
Console.WriteLine("{0,-12} {1}", If(String.IsNullOrEmpty(culture.Name),
"Invariant", culture.Name),
dat.ToString("d", culture))
Next
End Sub
End Module
' The example displays the following output:
' Invariant 03/01/2011
' en-US 3/1/2011
' fr-FR 01/03/2011
Benzer şekilde, aşağıdaki örnekte gösterildiği gibi, tek bir dize ayrıştırma işleminde kuralları kullanılan kültüre bağlı olarak farklı tarihler üretebilir.
using System;
using System.Globalization;
public class Example15
{
public static void Main()
{
string dateString = "07/10/2011";
CultureInfo[] cultures = { CultureInfo.InvariantCulture,
CultureInfo.CreateSpecificCulture("en-GB"),
CultureInfo.CreateSpecificCulture("en-US") };
Console.WriteLine("{0,-12} {1,10} {2,8} {3,8}\n", "Date String", "Culture",
"Month", "Day");
foreach (var culture in cultures) {
DateTime date = DateTime.Parse(dateString, culture);
Console.WriteLine("{0,-12} {1,10} {2,8} {3,8}", dateString,
String.IsNullOrEmpty(culture.Name) ?
"Invariant" : culture.Name,
date.Month, date.Day);
}
}
}
// The example displays the following output:
// Date String Culture Month Day
//
// 07/10/2011 Invariant 7 10
// 07/10/2011 en-GB 10 7
// 07/10/2011 en-US 7 10
open System
open System.Globalization
let dateString = "07/10/2011"
let cultures =
[| CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture "en-GB"
CultureInfo.CreateSpecificCulture "en-US" |]
printfn $"""{"Date String",-12} {"Culture",10} {"Month",8} {"Day",8}\n"""
for culture in cultures do
let date = DateTime.Parse(dateString, culture)
printfn $"""{dateString,-12} {(if String.IsNullOrEmpty culture.Name then "Invariant" else culture.Name),10} {date.Month,8} {date.Day,8}"""
// The example displays the following output:
// Date String Culture Month Day
//
// 07/10/2011 Invariant 7 10
// 07/10/2011 en-GB 10 7
// 07/10/2011 en-US 7 10
Imports System.Globalization
Module Example18
Public Sub Main()
Dim dateString As String = "07/10/2011"
Dim cultures() As CultureInfo = {CultureInfo.InvariantCulture,
CultureInfo.CreateSpecificCulture("en-GB"),
CultureInfo.CreateSpecificCulture("en-US")}
Console.WriteLine("{0,-12} {1,10} {2,8} {3,8}", "Date String", "Culture",
"Month", "Day")
Console.WriteLine()
For Each culture In cultures
Dim dat As Date = DateTime.Parse(dateString, culture)
Console.WriteLine("{0,-12} {1,10} {2,8} {3,8}", dateString,
If(String.IsNullOrEmpty(culture.Name),
"Invariant", culture.Name),
dat.Month, dat.Day)
Next
End Sub
End Module
' The example displays the following output:
' Date String Culture Month Day
'
' 07/10/2011 Invariant 7 10
' 07/10/2011 en-GB 10 7
' 07/10/2011 en-US 7 10
Dize karşılaştırması ve sıralaması
Dizeleri karşılaştırma ve sıralama kuralları kültürden kültüre farklılık gösterir. Örneğin, sıralama düzeni fonetiği veya karakterlerin görsel gösterimini temel alabilir. Doğu Asya dillerinde karakterler, ideografların vuruş ve radikallerine göre sıralanır. Sıralama, alfabe için kullanılan düzen dillerine ve kültürlere de bağlıdır. Örneğin, Danca dilinde alfabede "Z" işaretinden sonra sıralayan bir "Æ" karakteri vardır. Buna ek olarak, karşılaştırmalar büyük/küçük harfe duyarlı veya büyük/küçük harfe duyarlı olmayabilir ve büyük/küçük harf kuralları kültüre göre farklılık gösterebilir. Sıralı karşılaştırma ise dizeleri karşılaştırırken ve sıralarken dizedeki tek tek karakterlerin Unicode kod noktalarını kullanır.
Sıralama kuralları Unicode karakterlerinin alfabetik sırasını ve iki dizenin birbiriyle karşılaştırmasını belirler. Örneğin, String.Compare(String, String, StringComparison) yöntemi parametresine göre iki dizeyi StringComparison karşılaştırır. Parametre değeri ise StringComparison.CurrentCulture, yöntemi geçerli kültürün kurallarını kullanan bir dil karşılaştırması gerçekleştirir; parametre değeri ise StringComparison.Ordinal, yöntem sıralı bir karşılaştırma gerçekleştirir. Sonuç olarak, aşağıdaki örnekte gösterildiği gibi, geçerli kültür ABD İngilizcesi ise, yönteme String.Compare(String, String, StringComparison) ilk çağrı (kültüre duyarlı karşılaştırma kullanılarak), "a" değerinin "A" değerinden küçük olduğunu, ancak aynı yönteme yapılan ikinci çağrının (sıralı karşılaştırma kullanılarak) "a" değerinin "A" değerinden büyük olduğunu kabul eder.
using System;
using System.Globalization;
using System.Threading;
public class Example2
{
public static void Main()
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
Console.WriteLine(String.Compare("A", "a", StringComparison.CurrentCulture));
Console.WriteLine(String.Compare("A", "a", StringComparison.Ordinal));
}
}
// The example displays the following output:
// 1
// -32
open System
open System.Globalization
open System.Threading
Thread.CurrentThread.CurrentCulture <- CultureInfo.CreateSpecificCulture "en-US"
printfn $"""{String.Compare("A", "a", StringComparison.CurrentCulture)}"""
printfn $"""{String.Compare("A", "a", StringComparison.Ordinal)}"""
// The example displays the following output:
// 1
// -32
Imports System.Globalization
Imports System.Threading
Module Example3
Public Sub Main()
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
Console.WriteLine(String.Compare("A", "a", StringComparison.CurrentCulture))
Console.WriteLine(String.Compare("A", "a", StringComparison.Ordinal))
End Sub
End Module
' The example displays the following output:
' 1
' -32
.NET sözcük, dize ve sıralı sıralama kurallarını destekler:
Sözcük sıralama, belirli nonalfanumerik Unicode karakterlerin kendilerine özel ağırlıklar atanmış olabileceği dizelerin kültüre duyarlı bir karşılaştırmasını gerçekleştirir. Örneğin, kısa çizginin (-) kendisine çok küçük bir ağırlığı atanmış olabilir, böylece "coop" ve "co-op" sıralanmış bir listede yan yana görünür. Sözcük sıralama kurallarını kullanarak iki dizeyi String karşılaştıran yöntemlerin listesi için Kategoriye göre dize işlemleri bölümüne bakın.
Dize sıralama, kültüre duyarlı bir karşılaştırma da gerçekleştirir. Özel durumlar olmaması ve tüm alfasayısal Unicode karakterlerinden önce gelen tüm nonalfanumerik simgelerin olması dışında, sözcük sıralamaya benzer. dize sıralama kuralları kullanılarak, değeri CompareOptions.StringSortsağlanan bir
options
parametreye CompareInfo.Compare sahip yöntem aşırı yüklemeleri çağrılarak iki dize karşılaştırılabilir. .NET'in dize sıralama kurallarını kullanarak iki dizeyi karşılaştırmak için sağladığı tek yöntemin bu olduğunu unutmayın.Sıralı sıralama, dizelerdeki her Char nesnenin sayısal değerine göre dizeleri karşılaştırır. Bir karakterin küçük ve büyük harfli sürümleri farklı kod noktalarına sahip olduğundan sıralı karşılaştırma otomatik olarak büyük/küçük harfe duyarlıdır. Ancak, büyük/küçük harf önemli değilse, büyük/küçük harf yoksayılacak bir sıralı karşılaştırma belirtebilirsiniz. Bu, sabit kültürü kullanarak dizeyi büyük harfe dönüştürmeye ve ardından sonuç üzerinde sıralı bir karşılaştırma yapmaya eşdeğerdir. Sıralı sıralama kurallarını kullanarak iki dizeyi String karşılaştıran yöntemlerin listesi için Kategoriye göre dize işlemleri bölümüne bakın.
Kültüre duyarlı karşılaştırma, özelliği tarafından CultureInfo.InvariantCulture belirtilen sabit kültür de dahil olmak üzere bir nesneyi açıkça veya örtük olarak kullanan herhangi bir CultureInfo karşılaştırmadır. Örtük kültür, ve CultureInfo.CurrentCulture özellikleri tarafından Thread.CurrentCulture belirtilen geçerli kültürdür. Kültürler arasında alfabetik karakterlerin (yani özelliğinin döndürdüğü true
karakterlerin) sıralama düzeninde Char.IsLetter önemli bir varyasyon vardır. gibi Compare(String, String, CultureInfo, CompareOptions)bir dize karşılaştırma yöntemine nesne sağlayarak CultureInfo belirli bir kültürün kurallarını kullanan kültüre duyarlı bir karşılaştırma belirtebilirsiniz. geçerli kültürün kurallarını kullanan kültüre duyarlı bir karşılaştırma belirtmek için, veya StringComparison.CurrentCultureIgnoreCasedışında CompareOptions.Ordinal bir sabit listesi üyesini CompareOptions veya CompareOptions.OrdinalIgnoreCase yönteminin uygun bir aşırı yüklemesini Compare sağlayabilirsinizStringComparison.CurrentCulture. Kültüre duyarlı karşılaştırma genellikle sıralama için uygundur ancak sıralı karşılaştırma uygun değildir. Sıralı karşılaştırma genellikle iki dizenin eşit olup olmadığını belirlemek için uygundur (diğer bir ifadeyle kimlik belirlemek için), kültüre duyarlı karşılaştırma ise değildir.
Aşağıdaki örnekte kültüre duyarlı ve sıralı karşılaştırma arasındaki fark gösterilmektedir. Örnek, sıralı karşılaştırmayı ve da-DK ve en-US kültürlerinin kurallarını (yöntemin çağrıldığı anda varsayılan kültür olan) kullanarak "Apple", "Æble" ve "AEble" olmak üzere üç dizeyi Compare değerlendirir. Danca dili "Æ" karakterini tek bir harf olarak kabul ettiğinden ve alfabede "Z"den sonra sıraladığı için, "Æble" dizesi "Apple" değerinden büyüktür. Bununla birlikte, "Æble" "AEble" ile eşdeğer olarak kabul edilmez, bu nedenle "Æble" aynı zamanda "AEble" değerinden daha büyüktür. EN-US kültürü "Æ" harfini içermez, ancak "AE" ile eşdeğer olarak ele alır, bu da "Æble" öğesinin neden "Apple" değerinden küçük olduğunu ancak "AEble" ile eşit olduğunu açıklar. Sıralı karşılaştırma ise "Apple"ın "Æble" değerinden küçük, "Æble" değerinin ise "AEble" değerinden büyük olduğunu düşünmektedir.
using System;
using System.Globalization;
using System.Threading;
public class CompareStringSample
{
public static void Main()
{
string str1 = "Apple";
string str2 = "Æble";
string str3 = "AEble";
// Set the current culture to Danish in Denmark.
Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");
Console.WriteLine("Current culture: {0}",
CultureInfo.CurrentCulture.Name);
Console.WriteLine("Comparison of {0} with {1}: {2}",
str1, str2, String.Compare(str1, str2));
Console.WriteLine("Comparison of {0} with {1}: {2}\n",
str2, str3, String.Compare(str2, str3));
// Set the current culture to English in the U.S.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine("Current culture: {0}",
CultureInfo.CurrentCulture.Name);
Console.WriteLine("Comparison of {0} with {1}: {2}",
str1, str2, String.Compare(str1, str2));
Console.WriteLine("Comparison of {0} with {1}: {2}\n",
str2, str3, String.Compare(str2, str3));
// Perform an ordinal comparison.
Console.WriteLine("Ordinal comparison");
Console.WriteLine("Comparison of {0} with {1}: {2}",
str1, str2,
String.Compare(str1, str2, StringComparison.Ordinal));
Console.WriteLine("Comparison of {0} with {1}: {2}",
str2, str3,
String.Compare(str2, str3, StringComparison.Ordinal));
}
}
// The example displays the following output:
// Current culture: da-DK
// Comparison of Apple with Æble: -1
// Comparison of Æble with AEble: 1
//
// Current culture: en-US
// Comparison of Apple with Æble: 1
// Comparison of Æble with AEble: 0
//
// Ordinal comparison
// Comparison of Apple with Æble: -133
// Comparison of Æble with AEble: 133
open System
open System.Globalization
open System.Threading
let str1 = "Apple"
let str2 = "Æble"
let str3 = "AEble"
// Set the current culture to Danish in Denmark.
Thread.CurrentThread.CurrentCulture <- CultureInfo "da-DK"
printfn $"Current culture: {CultureInfo.CurrentCulture.Name}"
printfn $"Comparison of {str1} with {str2}: {String.Compare(str1, str2)}"
printfn $"Comparison of {str2} with {str3}: {String.Compare(str2, str3)}\n"
// Set the current culture to English in the U.S.
Thread.CurrentThread.CurrentCulture <- CultureInfo "en-US"
printfn $"Current culture: {CultureInfo.CurrentCulture.Name}"
printfn $"Comparison of {str1} with {str2}: {String.Compare(str1, str2)}"
printfn $"Comparison of {str2} with {str3}: {String.Compare(str2, str3)}\n"
// Perform an ordinal comparison.
printfn "Ordinal comparison"
printfn $"Comparison of {str1} with {str2}: {String.Compare(str1, str2, StringComparison.Ordinal)}"
printfn $"Comparison of {str2} with {str3}: {String.Compare(str2, str3, StringComparison.Ordinal)}"
// The example displays the following output:
// Current culture: da-DK
// Comparison of Apple with Æble: -1
// Comparison of Æble with AEble: 1
//
// Current culture: en-US
// Comparison of Apple with Æble: 1
// Comparison of Æble with AEble: 0
//
// Ordinal comparison
// Comparison of Apple with Æble: -133
// Comparison of Æble with AEble: 133
Imports System.Globalization
Imports System.Threading
Public Module Example6
Public Sub Main()
Dim str1 As String = "Apple"
Dim str2 As String = "Æble"
Dim str3 As String = "AEble"
' Set the current culture to Danish in Denmark.
Thread.CurrentThread.CurrentCulture = New CultureInfo("da-DK")
Console.WriteLine("Current culture: {0}",
CultureInfo.CurrentCulture.Name)
Console.WriteLine("Comparison of {0} with {1}: {2}",
str1, str2, String.Compare(str1, str2))
Console.WriteLine("Comparison of {0} with {1}: {2}",
str2, str3, String.Compare(str2, str3))
Console.WriteLine()
' Set the current culture to English in the U.S.
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
Console.WriteLine("Current culture: {0}",
CultureInfo.CurrentCulture.Name)
Console.WriteLine("Comparison of {0} with {1}: {2}",
str1, str2, String.Compare(str1, str2))
Console.WriteLine("Comparison of {0} with {1}: {2}",
str2, str3, String.Compare(str2, str3))
Console.WriteLine()
' Perform an ordinal comparison.
Console.WriteLine("Ordinal comparison")
Console.WriteLine("Comparison of {0} with {1}: {2}",
str1, str2,
String.Compare(str1, str2, StringComparison.Ordinal))
Console.WriteLine("Comparison of {0} with {1}: {2}",
str2, str3,
String.Compare(str2, str3, StringComparison.Ordinal))
End Sub
End Module
' The example displays the following output:
' Current culture: da-DK
' Comparison of Apple with Æble: -1
' Comparison of Æble with AEble: 1
'
' Current culture: en-US
' Comparison of Apple with Æble: 1
' Comparison of Æble with AEble: 0
'
' Ordinal comparison
' Comparison of Apple with Æble: -133
' Comparison of Æble with AEble: 133
Uygun bir sıralama veya dize karşılaştırma yöntemi seçmek için aşağıdaki genel yönergeleri kullanın:
Dizelerin kullanıcının kültürüne göre sıralanmasını istiyorsanız, bunları geçerli kültürün kurallarına göre sıralamanız gerekir. Kullanıcının kültürü değişirse, sıralanmış dizelerin sırası da buna göre değişir. Örneğin, eş anlamlılar sözlüğü uygulaması her zaman sözcükleri kullanıcının kültürüne göre sıralamalıdır.
Dizelerin belirli bir kültürün kurallarına göre sıralanmasını istiyorsanız, bir karşılaştırma yöntemine bu kültürü temsil eden bir CultureInfo nesne sağlayarak bunları sıralamanız gerekir. Örneğin, öğrencilere belirli bir dili öğretmek için tasarlanmış bir uygulamada, dizelerin bu dili konuşan kültürlerden birinin kurallarına göre sıralanmasını istersiniz.
Dizelerin sırasının kültürler arasında değişmeden kalmasını istiyorsanız, bunları sabit kültürün kurallarına göre sıralamanız veya sıralı bir karşılaştırma kullanmanız gerekir. Örneğin, dosyaların, işlemlerin, köşelerin veya adlandırılmış kanalların adlarını düzenlemek için sıralı bir sıralama kullanabilirsiniz.
Güvenlik kararı içeren bir karşılaştırma için (kullanıcı adının geçerli olup olmadığı gibi), yöntemin aşırı yüklemesini Equals çağırarak her zaman eşitlik için sıralı bir test gerçekleştirmeniz gerekir.
Not
Dize karşılaştırmasında kullanılan kültüre duyarlı sıralama ve büyük/küçük harf kuralları .NET sürümüne bağlıdır. .NET Core'da dize karşılaştırması, temel işletim sistemi tarafından desteklenen Unicode Standardı sürümüne bağlıdır. Windows 8 veya sonraki sürümlerde çalışan .NET Framework 4.5 ve sonraki sürümlerde sıralama, büyük/küçük harf, normalleştirme ve Unicode karakter bilgileri Unicode 6.0 standardına uygundur. Diğer Windows işletim sistemlerinde Unicode 5.0 standardına uygundur.
Sözcük, dize ve sıralı sıralama kuralları hakkında daha fazla bilgi için konuya bakın System.Globalization.CompareOptions . Her kuralın ne zaman kullanılacağı hakkında ek öneriler için bkz . Dizeleri Kullanmak için En İyi Yöntemler.
Normalde, dizelerin sıralama düzenini belirlemek için doğrudan gibi Compare dize karşılaştırma yöntemlerini çağırmazsınız. Bunun yerine, karşılaştırma yöntemleri veya List<T>.Sortgibi Array.Sort sıralama yöntemleriyle çağrılır. Aşağıdaki örnek, dize karşılaştırma yöntemini açıkça çağırmadan dört farklı sıralama işlemi (geçerli kültür kullanılarak sözcük sıralama, sabit kültür kullanılarak sözcük sıralama, sıralı sıralama ve sabit kültürü kullanarak dize sıralama) gerçekleştirir, ancak kullanılacak karşılaştırma türünü belirtir. Her sıralama türünün dizisinde benzersiz bir dize sıralaması ürettiğini unutmayın.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
public class Example3
{
public static void Main()
{
string[] strings = { "coop", "co-op", "cooperative",
"co\u00ADoperative", "cœur", "coeur" };
// Perform a word sort using the current (en-US) culture.
string[] current = new string[strings.Length];
strings.CopyTo(current, 0);
Array.Sort(current, StringComparer.CurrentCulture);
// Perform a word sort using the invariant culture.
string[] invariant = new string[strings.Length];
strings.CopyTo(invariant, 0);
Array.Sort(invariant, StringComparer.InvariantCulture);
// Perform an ordinal sort.
string[] ordinal = new string[strings.Length];
strings.CopyTo(ordinal, 0);
Array.Sort(ordinal, StringComparer.Ordinal);
// Perform a string sort using the current culture.
string[] stringSort = new string[strings.Length];
strings.CopyTo(stringSort, 0);
Array.Sort(stringSort, new SCompare());
// Display array values
Console.WriteLine("{0,13} {1,13} {2,15} {3,13} {4,13}\n",
"Original", "Word Sort", "Invariant Word",
"Ordinal Sort", "String Sort");
for (int ctr = 0; ctr < strings.Length; ctr++)
Console.WriteLine("{0,13} {1,13} {2,15} {3,13} {4,13}",
strings[ctr], current[ctr], invariant[ctr],
ordinal[ctr], stringSort[ctr] );
}
}
// IComparer<String> implementation to perform string sort.
internal class SCompare : IComparer<String>
{
public int Compare(string x, string y)
{
return CultureInfo.CurrentCulture.CompareInfo.Compare(x, y, CompareOptions.StringSort);
}
}
// The example displays the following output:
// Original Word Sort Invariant Word Ordinal Sort String Sort
//
// coop cœur cœur co-op co-op
// co-op coeur coeur coeur cœur
// cooperative coop coop coop coeur
// cooperative co-op co-op cooperative coop
// cœur cooperative cooperative cooperative cooperative
// coeur cooperative cooperative cœur cooperative
open System
open System.Collections.Generic
open System.Globalization
// IComparer<String> implementation to perform string sort using an F# object expression.
let scompare =
{ new IComparer<String> with
member _.Compare(x, y) =
CultureInfo.CurrentCulture.CompareInfo.Compare(x, y, CompareOptions.StringSort) }
let strings = [| "coop"; "co-op"; "cooperative"; "co\u00ADoperative"; "cœur"; "coeur" |]
// Perform a word sort using the current (en-US) culture.
let current = Array.copy strings
Array.Sort(current, StringComparer.CurrentCulture)
// Perform a word sort using the invariant culture.
let invariant = Array.copy strings
Array.Sort(invariant, StringComparer.InvariantCulture)
// Perform an ordinal sort.
let ordinal = Array.copy strings
Array.Sort(ordinal, StringComparer.Ordinal)
// Perform a string sort using the current culture.
let stringSort = Array.copy strings
Array.Sort(stringSort, scompare)
// Display array values
printfn "%13s %13s %15s %13s %13s\n" "Original" "Word Sort" "Invariant Word" "Ordinal Sort" "String Sort"
for i = 0 to strings.Length - 1 do
printfn "%13s %13s %15s %13s %13s\n" strings[i] current[i] invariant[i] ordinal[i] stringSort[i]
// The example displays the following output:
// Original Word Sort Invariant Word Ordinal Sort String Sort
//
// coop cœur cœur co-op co-op
// co-op coeur coeur coeur cœur
// cooperative coop coop coop coeur
// cooperative co-op co-op cooperative coop
// cœur cooperative cooperative cooperative cooperative
// coeur cooperative cooperative cœur cooperative
Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Module Example4
Public Sub Main()
Dim strings() As String = {"coop", "co-op", "cooperative",
"co" + ChrW(&HAD) + "operative",
"cœur", "coeur"}
' Perform a word sort using the current (en-US) culture.
Dim current(strings.Length - 1) As String
strings.CopyTo(current, 0)
Array.Sort(current, StringComparer.CurrentCulture)
' Perform a word sort using the invariant culture.
Dim invariant(strings.Length - 1) As String
strings.CopyTo(invariant, 0)
Array.Sort(invariant, StringComparer.InvariantCulture)
' Perform an ordinal sort.
Dim ordinal(strings.Length - 1) As String
strings.CopyTo(ordinal, 0)
Array.Sort(ordinal, StringComparer.Ordinal)
' Perform a string sort using the current culture.
Dim stringSort(strings.Length - 1) As String
strings.CopyTo(stringSort, 0)
Array.Sort(stringSort, New SCompare())
' Display array values
Console.WriteLine("{0,13} {1,13} {2,15} {3,13} {4,13}",
"Original", "Word Sort", "Invariant Word",
"Ordinal Sort", "String Sort")
Console.WriteLine()
For ctr As Integer = 0 To strings.Length - 1
Console.WriteLine("{0,13} {1,13} {2,15} {3,13} {4,13}",
strings(ctr), current(ctr), invariant(ctr),
ordinal(ctr), stringSort(ctr))
Next
End Sub
End Module
' IComparer<String> implementation to perform string sort.
Friend Class SCompare : Implements IComparer(Of String)
Public Function Compare(x As String, y As String) As Integer _
Implements IComparer(Of String).Compare
Return CultureInfo.CurrentCulture.CompareInfo.Compare(x, y, CompareOptions.StringSort)
End Function
End Class
' The example displays the following output:
' Original Word Sort Invariant Word Ordinal Sort String Sort
'
' coop cœur cœur co-op co-op
' co-op coeur coeur coeur cœur
' cooperative coop coop coop coeur
' cooperative co-op co-op cooperative coop
' cœur cooperative cooperative cooperative cooperative
' coeur cooperative cooperative cœur cooperative
İpucu
.NET, kültürel açıdan hassas dize karşılaştırmasını desteklemek için dahili olarak sıralama anahtarlarını kullanır. Bir dizedeki her karaktere alfabetik, büyük/küçük harf ve aksan gibi çeşitli sıralama ağırlıkları kategorileri verilir. sınıfı tarafından SortKey temsil edilen sıralama anahtarı, belirli bir dize için bu ağırlıkların deposunu sağlar. Uygulamanız aynı dize kümesinde çok sayıda arama veya sıralama işlemi gerçekleştiriyorsa, kullandığı tüm dizeler için sıralama anahtarları oluşturup depolayarak performansını geliştirebilirsiniz. Sıralama veya karşılaştırma işlemi gerektiğinde, dizeler yerine sıralama tuşlarını kullanırsınız. Daha fazla bilgi için sınıfına SortKey bakın.
Dize karşılaştırma kuralı belirtmezseniz, dizeler üzerinde kültüre duyarlı, büyük/küçük harfe duyarlı sıralama gerçekleştirme gibi Array.Sort(Array) sıralama yöntemleri. Aşağıdaki örnek, geçerli kültürü değiştirmenin dizideki sıralı dizelerin sırasını nasıl etkilediğini göstermektedir. Üç dizeden oluşan bir dizi oluşturur. İlk olarak, özelliği en-US olarak ayarlar System.Threading.Thread.CurrentThread.CurrentCulture
ve yöntemini çağırır Array.Sort(Array) . Sonuçta elde edilen sıralama düzeni, İngilizce (Birleşik Devletler) kültürü için sıralama kurallarını temel alır. Ardından, örnek özelliğini da-DK olarak ayarlar System.Threading.Thread.CurrentThread.CurrentCulture
ve yöntemini yeniden çağırır Array.Sort . Elde edilen sıralama düzeninin, Danca (Danimarka) için sıralama kurallarını kullandığından en-US sonuçlarından nasıl farklı olduğunu görebilirsiniz.
using System;
using System.Globalization;
using System.Threading;
public class ArraySort
{
public static void Main(String[] args)
{
// Create and initialize a new array to store the strings.
string[] stringArray = { "Apple", "Æble", "Zebra"};
// Display the values of the array.
Console.WriteLine( "The original string array:");
PrintIndexAndValues(stringArray);
// Set the CurrentCulture to "en-US".
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
// Sort the values of the array.
Array.Sort(stringArray);
// Display the values of the array.
Console.WriteLine("After sorting for the culture \"en-US\":");
PrintIndexAndValues(stringArray);
// Set the CurrentCulture to "da-DK".
Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");
// Sort the values of the Array.
Array.Sort(stringArray);
// Display the values of the array.
Console.WriteLine("After sorting for the culture \"da-DK\":");
PrintIndexAndValues(stringArray);
}
public static void PrintIndexAndValues(string[] myArray)
{
for (int i = myArray.GetLowerBound(0); i <=
myArray.GetUpperBound(0); i++ )
Console.WriteLine("[{0}]: {1}", i, myArray[i]);
Console.WriteLine();
}
}
// The example displays the following output:
// The original string array:
// [0]: Apple
// [1]: Æble
// [2]: Zebra
//
// After sorting for the "en-US" culture:
// [0]: Æble
// [1]: Apple
// [2]: Zebra
//
// After sorting for the culture "da-DK":
// [0]: Apple
// [1]: Zebra
// [2]: Æble
open System
open System.Globalization
open System.Threading
let printIndexAndValues (myArray: string[]) =
for i = myArray.GetLowerBound 0 to myArray.GetUpperBound 0 do
printfn $"[{i}]: {myArray[i]}"
printfn ""
// Create and initialize a new array to store the strings.
let stringArray = [| "Apple"; "Æble"; "Zebra" |]
// Display the values of the array.
printfn "The original string array:"
printIndexAndValues stringArray
// Set the CurrentCulture to "en-US".
Thread.CurrentThread.CurrentCulture <- CultureInfo "en-US"
// Sort the values of the array.
Array.Sort stringArray
// Display the values of the array.
printfn "After sorting for the culture \"en-US\":"
printIndexAndValues stringArray
// Set the CurrentCulture to "da-DK".
Thread.CurrentThread.CurrentCulture <- CultureInfo "da-DK"
// Sort the values of the Array.
Array.Sort stringArray
// Display the values of the array.
printfn "After sorting for the culture \"da-DK\":"
printIndexAndValues stringArray
// The example displays the following output:
// The original string array:
// [0]: Apple
// [1]: Æble
// [2]: Zebra
//
// After sorting for the "en-US" culture:
// [0]: Æble
// [1]: Apple
// [2]: Zebra
//
// After sorting for the culture "da-DK":
// [0]: Apple
// [1]: Zebra
// [2]: Æble
Imports System.Globalization
Imports System.IO
Imports System.Threading
Public Class TextToFile
Public Shared Sub Main()
' Creates and initializes a new array to store
' these date/time objects.
Dim stringArray() As String = { "Apple", "Æble", "Zebra"}
' Displays the values of the array.
Console.WriteLine("The original string array:")
PrintIndexAndValues(stringArray)
' Set the CurrentCulture to "en-US".
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
' Sort the values of the Array.
Array.Sort(stringArray)
' Display the values of the array.
Console.WriteLine("After sorting for the ""en-US"" culture:")
PrintIndexAndValues(stringArray)
' Set the CurrentCulture to "da-DK".
Thread.CurrentThread.CurrentCulture = New CultureInfo("da-DK")
' Sort the values of the Array.
Array.Sort(stringArray)
' Displays the values of the Array.
Console.WriteLine("After sorting for the culture ""da-DK"":")
PrintIndexAndValues(stringArray)
End Sub
Public Shared Sub PrintIndexAndValues(myArray() As String)
For i As Integer = myArray.GetLowerBound(0) To myArray.GetUpperBound(0)
Console.WriteLine("[{0}]: {1}", i, myArray(i))
Next
Console.WriteLine()
End Sub
End Class
' The example displays the following output:
' The original string array:
' [0]: Apple
' [1]: Æble
' [2]: Zebra
'
' After sorting for the "en-US" culture:
' [0]: Æble
' [1]: Apple
' [2]: Zebra
'
' After sorting for the culture "da-DK":
' [0]: Apple
' [1]: Zebra
' [2]: Æble
Uyarı
Dizeleri karşılaştırmada birincil amacınız eşit olup olmadıklarını belirlemekse yöntemini çağırmanız String.Equals gerekir. Normalde, sıralı bir karşılaştırma yapmak için kullanmanız Equals gerekir. String.Compare yöntemi öncelikle dizeleri sıralamak için tasarlanmıştır.
ve String.IndexOfgibi String.StartsWith dize arama yöntemleri de kültüre duyarlı veya sıralı dize karşılaştırmaları gerçekleştirebilir. Aşağıdaki örnek, yöntemini kullanarak IndexOf sıra ve kültüre duyarlı karşılaştırmalar arasındaki farkları gösterir. Geçerli kültürün İngilizce (Birleşik Devletler) olduğu kültüre duyarlı bir arama, "œ" ligatürüyle eşleşecek şekilde "oe" alt dizesini dikkate alır. Yumuşak kısa çizgi (U+00AD) sıfır genişlikli bir karakter olduğundan, arama yumuşak kısa çizgiye String.Empty eşdeğer olarak davranır ve dizenin başında bir eşleşme bulur. Öte yandan sıralı arama her iki durumda da eşleşme bulamaz.
using System;
public class Example8
{
public static void Main()
{
// Search for "oe" and "œu" in "œufs" and "oeufs".
string s1 = "œufs";
string s2 = "oeufs";
FindInString(s1, "oe", StringComparison.CurrentCulture);
FindInString(s1, "oe", StringComparison.Ordinal);
FindInString(s2, "œu", StringComparison.CurrentCulture);
FindInString(s2, "œu", StringComparison.Ordinal);
Console.WriteLine();
string s3 = "co\u00ADoperative";
FindInString(s3, "\u00AD", StringComparison.CurrentCulture);
FindInString(s3, "\u00AD", StringComparison.Ordinal);
}
private static void FindInString(string s, string substring, StringComparison options)
{
int result = s.IndexOf(substring, options);
if (result != -1)
Console.WriteLine("'{0}' found in {1} at position {2}",
substring, s, result);
else
Console.WriteLine("'{0}' not found in {1}",
substring, s);
}
}
// The example displays the following output:
// 'oe' found in œufs at position 0
// 'oe' not found in œufs
// 'œu' found in oeufs at position 0
// 'œu' not found in oeufs
//
// '' found in cooperative at position 0
// '' found in cooperative at position 2
open System
let findInString (s: string) (substring: string) (options: StringComparison) =
let result = s.IndexOf(substring, options)
if result <> -1 then
printfn $"'{substring}' found in {s} at position {result}"
else
printfn $"'{substring}' not found in {s}"
// Search for "oe" and "œu" in "œufs" and "oeufs".
let s1 = "œufs"
let s2 = "oeufs"
findInString s1 "oe" StringComparison.CurrentCulture
findInString s1 "oe" StringComparison.Ordinal
findInString s2 "œu" StringComparison.CurrentCulture
findInString s2 "œu" StringComparison.Ordinal
printfn ""
let s3 = "co\u00ADoperative"
findInString s3 "\u00AD" StringComparison.CurrentCulture
findInString s3 "\u00AD" StringComparison.Ordinal
// The example displays the following output:
// 'oe' found in œufs at position 0
// 'oe' not found in œufs
// 'œu' found in oeufs at position 0
// 'œu' not found in oeufs
//
// '' found in cooperative at position 0
// '' found in cooperative at position 2
Module Example5
Public Sub Main()
' Search for "oe" and "œu" in "œufs" and "oeufs".
Dim s1 As String = "œufs"
Dim s2 As String = "oeufs"
FindInString(s1, "oe", StringComparison.CurrentCulture)
FindInString(s1, "oe", StringComparison.Ordinal)
FindInString(s2, "œu", StringComparison.CurrentCulture)
FindInString(s2, "œu", StringComparison.Ordinal)
Console.WriteLine()
Dim softHyphen As String = ChrW(&HAD)
Dim s3 As String = "co" + softHyphen + "operative"
FindInString(s3, softHyphen, StringComparison.CurrentCulture)
FindInString(s3, softHyphen, StringComparison.Ordinal)
End Sub
Private Sub FindInString(s As String, substring As String,
options As StringComparison)
Dim result As Integer = s.IndexOf(substring, options)
If result <> -1 Then
Console.WriteLine("'{0}' found in {1} at position {2}",
substring, s, result)
Else
Console.WriteLine("'{0}' not found in {1}",
substring, s)
End If
End Sub
End Module
' The example displays the following output:
' 'oe' found in œufs at position 0
' 'oe' not found in œufs
' 'œu' found in oeufs at position 0
' 'œu' not found in oeufs
'
' '' found in cooperative at position 0
' '' found in cooperative at position 2
Dizelerde arama
ve String.IndexOfgibi String.StartsWith dize arama yöntemleri, bir karakterin veya alt dizenin belirtilen dizede bulunup bulunmadığını belirlemek için kültüre duyarlı veya sıralı dize karşılaştırmaları da gerçekleştirebilir.
sınıfındaki String yöntem gibi tek bir karakteri veya yöntem gibi IndexOf bir karakter kümesini arayan arama yöntemlerinin IndexOfAny tümü sıralı bir arama gerçekleştirir. Bir karakter için kültüre duyarlı bir arama gerçekleştirmek için veya CompareInfo.LastIndexOf(String, Char)gibi CompareInfo.IndexOf(String, Char) bir CompareInfo yöntemi çağırmanız gerekir. Sıra ve kültüre duyarlı karşılaştırma kullanarak karakter aramanın sonuçlarının çok farklı olabileceğini unutmayın. Örneğin, "Æ" (U+00C6) ligatürü gibi önceden derlenmiş bir Unicode karakteri için yapılan arama, bileşenlerinin kültüre bağlı olarak "AE" (U+041U+0045) gibi doğru dizideki oluşumlarıyla eşleşebilir. Aşağıdaki örnekte, tek bir karakter aranırken ve CompareInfo.IndexOf(String, Char) yöntemleri arasındaki String.IndexOf(Char) fark gösterilmektedir. "æ" (U+00E6) ligatürü, en-US kültürünün kuralları kullanılırken "aerial" dizesinde bulunur, ancak da-DK kültürünün kuralları kullanılırken veya sıralı karşılaştırma yapılırken bulunmaz.
using System;
using System.Globalization;
public class Example17
{
public static void Main()
{
String[] cultureNames = { "da-DK", "en-US" };
CompareInfo ci;
String str = "aerial";
Char ch = 'æ'; // U+00E6
Console.Write("Ordinal comparison -- ");
Console.WriteLine("Position of '{0}' in {1}: {2}", ch, str,
str.IndexOf(ch));
foreach (var cultureName in cultureNames) {
ci = CultureInfo.CreateSpecificCulture(cultureName).CompareInfo;
Console.Write("{0} cultural comparison -- ", cultureName);
Console.WriteLine("Position of '{0}' in {1}: {2}", ch, str,
ci.IndexOf(str, ch));
}
}
}
// The example displays the following output:
// Ordinal comparison -- Position of 'æ' in aerial: -1
// da-DK cultural comparison -- Position of 'æ' in aerial: -1
// en-US cultural comparison -- Position of 'æ' in aerial: 0
open System.Globalization
let cultureNames = [| "da-DK"; "en-US" |]
let str = "aerial"
let ch = 'æ' // U+00E6
printf "Ordinal comparison -- "
printfn $"Position of '{ch}' in {str}: {str.IndexOf ch}"
for cultureName in cultureNames do
let ci = CultureInfo.CreateSpecificCulture(cultureName).CompareInfo
printf $"{cultureName} cultural comparison -- "
printfn $"Position of '{ch}' in {str}: {ci.IndexOf(str, ch)}"
// The example displays the following output:
// Ordinal comparison -- Position of 'æ' in aerial: -1
// da-DK cultural comparison -- Position of 'æ' in aerial: -1
// en-US cultural comparison -- Position of 'æ' in aerial: 0
Imports System.Globalization
Module Example19
Public Sub Main()
Dim cultureNames() As String = {"da-DK", "en-US"}
Dim ci As CompareInfo
Dim str As String = "aerial"
Dim ch As Char = "æ"c ' U+00E6
Console.Write("Ordinal comparison -- ")
Console.WriteLine("Position of '{0}' in {1}: {2}", ch, str,
str.IndexOf(ch))
For Each cultureName In cultureNames
ci = CultureInfo.CreateSpecificCulture(cultureName).CompareInfo
Console.Write("{0} cultural comparison -- ", cultureName)
Console.WriteLine("Position of '{0}' in {1}: {2}", ch, str,
ci.IndexOf(str, ch))
Next
End Sub
End Module
' The example displays the following output:
' Ordinal comparison -- Position of 'æ' in aerial: -1
' da-DK cultural comparison -- Position of 'æ' in aerial: -1
' en-US cultural comparison -- Position of 'æ' in aerial: 0
Öte yandan, bir karakter yerine dize arayan sınıf yöntemleri, String arama seçenekleri türündeki StringComparisonbir parametre tarafından açıkça belirtilmezse kültüre duyarlı bir arama gerçekleştirir. Tek istisna, sıralı bir arama gerçekleştiren 'dir Contains.
Eşitlik testi
sıralama düzeninde String.Compare iki dizenin ilişkisini belirlemek için yöntemini kullanın. Bu genellikle kültüre duyarlı bir işlemdir. Buna karşılık, eşitliği test etmek için yöntemini çağırın String.Equals . Eşitlik testi genellikle kullanıcı girişini geçerli bir kullanıcı adı, parola veya dosya sistemi yolu gibi bilinen bir dizeyle karşılaştırdığından, bu genellikle sıralı bir işlemdir.
Uyarı
yöntemini çağırıp dönüş değerinin String.Compare sıfır olup olmadığını belirleyerek eşitliği test etmek mümkündür. Ancak, bu uygulama önerilmez. İki dizenin eşit olup olmadığını belirlemek için yönteminin aşırı yüklemelerinden String.Equals birini çağırmanız gerekir. Çağrılmak için tercih edilen aşırı yükleme, örnek Equals(String, StringComparison) yöntemi veya statik Equals(String, String, StringComparison) yöntemdir, çünkü her iki yöntem de karşılaştırma türünü açıkça belirten bir System.StringComparison parametre içerir.
Aşağıdaki örnek, bunun yerine sıralı bir karşılaştırma kullanılması gerektiğinde eşitlik için kültüre duyarlı bir karşılaştırma gerçekleştirmenin tehlikesini göstermektedir. Bu durumda kodun amacı, "FILE://" veya "file://" ile başlayan URL'lerden dosya sistemi erişimini yasaklayarak URL'nin başlangıcını "FILE://" dizesiyle büyük/küçük harfe duyarlı olmayan bir karşılaştırma yapmaktır. Ancak " file://" ile başlayan bir URL üzerinde Türkçe (Türkiye) kültürü kullanılarak kültüre duyarlı bir karşılaştırma yapılırsa, küçük harf "i" nin Türkçe büyük harf eşdeğeri "I" yerine "İ" olduğu için eşitlik karşılaştırması başarısız olur. Sonuç olarak, dosya sistemi erişimine yanlışlıkla izin verilir. Öte yandan, sıralı bir karşılaştırma yapılırsa, eşitlik karşılaştırması başarılı olur ve dosya sistemi erişimi reddedilir.
using System;
using System.Globalization;
using System.Threading;
public class Example4
{
public static void Main()
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("tr-TR");
string filePath = "file://c:/notes.txt";
Console.WriteLine("Culture-sensitive test for equality:");
if (! TestForEquality(filePath, StringComparison.CurrentCultureIgnoreCase))
Console.WriteLine("Access to {0} is allowed.", filePath);
else
Console.WriteLine("Access to {0} is not allowed.", filePath);
Console.WriteLine("\nOrdinal test for equality:");
if (! TestForEquality(filePath, StringComparison.OrdinalIgnoreCase))
Console.WriteLine("Access to {0} is allowed.", filePath);
else
Console.WriteLine("Access to {0} is not allowed.", filePath);
}
private static bool TestForEquality(string str, StringComparison cmp)
{
int position = str.IndexOf("://");
if (position < 0) return false;
string substring = str.Substring(0, position);
return substring.Equals("FILE", cmp);
}
}
// The example displays the following output:
// Culture-sensitive test for equality:
// Access to file://c:/notes.txt is allowed.
//
// Ordinal test for equality:
// Access to file://c:/notes.txt is not allowed.
open System
open System.Globalization
open System.Threading
let testForEquality (str: string) (cmp: StringComparison) =
let position = str.IndexOf "://"
if position < 0 then false
else
let substring = str.Substring(0, position)
substring.Equals("FILE", cmp)
Thread.CurrentThread.CurrentCulture <- CultureInfo.CreateSpecificCulture "tr-TR"
let filePath = "file://c:/notes.txt"
printfn "Culture-sensitive test for equality:"
if not (testForEquality filePath StringComparison.CurrentCultureIgnoreCase) then
printfn $"Access to {filePath} is allowed."
else
printfn $"Access to {filePath} is not allowed."
printfn "\nOrdinal test for equality:"
if not (testForEquality filePath StringComparison.OrdinalIgnoreCase) then
printfn $"Access to {filePath} is allowed."
else
printfn $"Access to {filePath} is not allowed."
// The example displays the following output:
// Culture-sensitive test for equality:
// Access to file://c:/notes.txt is allowed.
//
// Ordinal test for equality:
// Access to file://c:/notes.txt is not allowed.
Imports System.Globalization
Imports System.Threading
Module Example7
Public Sub Main()
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("tr-TR")
Dim filePath As String = "file://c:/notes.txt"
Console.WriteLine("Culture-sensitive test for equality:")
If Not TestForEquality(filePath, StringComparison.CurrentCultureIgnoreCase) Then
Console.WriteLine("Access to {0} is allowed.", filePath)
Else
Console.WriteLine("Access to {0} is not allowed.", filePath)
End If
Console.WriteLine()
Console.WriteLine("Ordinal test for equality:")
If Not TestForEquality(filePath, StringComparison.OrdinalIgnoreCase) Then
Console.WriteLine("Access to {0} is allowed.", filePath)
Else
Console.WriteLine("Access to {0} is not allowed.", filePath)
End If
End Sub
Private Function TestForEquality(str As String, cmp As StringComparison) As Boolean
Dim position As Integer = str.IndexOf("://")
If position < 0 Then Return False
Dim substring As String = str.Substring(0, position)
Return substring.Equals("FILE", cmp)
End Function
End Module
' The example displays the following output:
' Culture-sensitive test for equality:
' Access to file://c:/notes.txt is allowed.
'
' Ordinal test for equality:
' Access to file://c:/notes.txt is not allowed.
Normalleştirme
Bazı Unicode karakterlerinin birden çok gösterimi vardır. Örneğin, aşağıdaki kod noktalarından herhangi biri "ắ" harfini temsil edebilir:
- U+1EAF
- U+0103 U+0301
- U+0061 U+0306 U+0301
Tek bir karakter için birden çok gösterim arama, sıralama, eşleştirme ve diğer dize işlemlerini karmaşıklaştırır.
Unicode standardı, eşdeğer ikili gösterimlerinden herhangi biri için Unicode karakterinin bir ikili gösterimini döndüren normalleştirme adlı bir işlemi tanımlar. Normalleştirme, farklı kurallara uyan, normalleştirme formları olarak adlandırılan çeşitli algoritmalar kullanabilir. .NET, C, D, KC ve KD unicode normalleştirme formlarını destekler. Dizeler aynı normalleştirme formuna normalleştirildiğinde sıralı karşılaştırma kullanılarak karşılaştırılabilir.
Sıralı karşılaştırma, her dizedeki karşılık gelen Char nesnelerin Unicode skaler değerinin ikili karşılaştırmasıdır. sınıfı, String aşağıdakiler de dahil olmak üzere sıralı karşılaştırma gerçekleştirebilen bir dizi yöntem içerir:
Parametre içeren , , , , , IndexOfve LastIndexOf yöntemlerinin herhangi bir StringComparison aşırı yüklemesiCompare. EndsWithStartsWithEquals yöntemi, bu parametre için veya OrdinalIgnoreCase değerini StringComparison.Ordinal sağlarsanız sıralı bir karşılaştırma gerçekleştirir.
yönteminin CompareOrdinal aşırı yüklemeleri.
, ve Splitgibi ContainsReplacesıralı karşılaştırmayı varsayılan olarak kullanan yöntemler.
Dize örneğindeki bir Char dizideki Char bir değeri veya öğeleri arayan yöntemler. Bu tür yöntemler arasında ve Split(Char[])bulunurIndexOf(Char).
Yöntemini çağırarak String.IsNormalized() bir dizenin C normalleştirme formuna normalleştirilip normalleştirilmediğini belirleyebilir veya bir dizenin String.IsNormalized(NormalizationForm) belirtilen normalleştirme formuna normalleştirilip normalleştirilmediğini belirlemek için yöntemini çağırabilirsiniz. Ayrıca, bir dizeyi String.Normalize() C normalleştirme formuna dönüştürmek için yöntemini çağırabilir veya bir dizeyi String.Normalize(NormalizationForm) belirtilen normalleştirme formuna dönüştürmek için yöntemini çağırabilirsiniz. Dizeleri normalleştirme ve karşılaştırma hakkında adım adım bilgi için ve yöntemlerine Normalize() Normalize(NormalizationForm) bakın.
Aşağıdaki basit örnekte dize normalleştirme gösterilmektedir. "ố" harfini üç farklı dizede üç farklı şekilde tanımlar ve her dizenin diğer iki dizeden farklı olduğunu belirlemek için eşitlik için sıralı bir karşılaştırma kullanır. Ardından her dizeyi desteklenen normalleştirme formlarına dönüştürür ve yine belirtilen normalleştirme formundaki her dizenin sıralı karşılaştırmasını gerçekleştirir. Her durumda, ikinci eşitlik testi dizelerin eşit olduğunu gösterir.
using System;
using System.Globalization;
using System.IO;
using System.Text;
public class Example13
{
private static StreamWriter sw;
public static void Main()
{
sw = new StreamWriter(@".\TestNorm1.txt");
// Define three versions of the same word.
string s1 = "sống"; // create word with U+1ED1
string s2 = "s\u00F4\u0301ng";
string s3 = "so\u0302\u0301ng";
TestForEquality(s1, s2, s3);
sw.WriteLine();
// Normalize and compare strings using each normalization form.
foreach (string formName in Enum.GetNames(typeof(NormalizationForm)))
{
sw.WriteLine("Normalization {0}:\n", formName);
NormalizationForm nf = (NormalizationForm) Enum.Parse(typeof(NormalizationForm), formName);
string[] sn = NormalizeStrings(nf, s1, s2, s3);
TestForEquality(sn);
sw.WriteLine("\n");
}
sw.Close();
}
private static void TestForEquality(params string[] words)
{
for (int ctr = 0; ctr <= words.Length - 2; ctr++)
for (int ctr2 = ctr + 1; ctr2 <= words.Length - 1; ctr2++)
sw.WriteLine("{0} ({1}) = {2} ({3}): {4}",
words[ctr], ShowBytes(words[ctr]),
words[ctr2], ShowBytes(words[ctr2]),
words[ctr].Equals(words[ctr2], StringComparison.Ordinal));
}
private static string ShowBytes(string str)
{
string result = null;
foreach (var ch in str)
result += $"{(ushort)ch:X4} ";
return result.Trim();
}
private static string[] NormalizeStrings(NormalizationForm nf, params string[] words)
{
for (int ctr = 0; ctr < words.Length; ctr++)
if (! words[ctr].IsNormalized(nf))
words[ctr] = words[ctr].Normalize(nf);
return words;
}
}
// The example displays the following output:
// sống (0073 1ED1 006E 0067) = sống (0073 00F4 0301 006E 0067): False
// sống (0073 1ED1 006E 0067) = sống (0073 006F 0302 0301 006E 0067): False
// sống (0073 00F4 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): False
//
// Normalization FormC:
//
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
//
//
// Normalization FormD:
//
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
//
//
// Normalization FormKC:
//
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
//
//
// Normalization FormKD:
//
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
open System
open System.IO
open System.Text
do
use sw = new StreamWriter(@".\TestNorm1.txt")
let showBytes (str: string) =
let mutable result = ""
for ch in str do
result <- result + $"{uint16 ch:X4} "
result.Trim()
let testForEquality (words: string[]) =
for ctr = 0 to words.Length - 2 do
for ctr2 = ctr + 1 to words.Length - 1 do
sw.WriteLine("{0} ({1}) = {2} ({3}): {4}",
words[ctr], showBytes(words[ctr]),
words[ctr2], showBytes(words[ctr2]),
words[ctr].Equals(words[ctr2], StringComparison.Ordinal))
let normalizeStrings nf (words: string[]) =
for i = 0 to words.Length - 1 do
if not (words[i].IsNormalized nf) then
words[i] <- words[i].Normalize nf
words
// Define three versions of the same word.
let s1 = "sống" // create word with U+1ED1
let s2 = "s\u00F4\u0301ng"
let s3 = "so\u0302\u0301ng"
testForEquality [| s1; s2; s3 |]
sw.WriteLine()
// Normalize and compare strings using each normalization form.
for formName in Enum.GetNames typeof<NormalizationForm> do
sw.WriteLine("Normalization {0}:\n", formName)
let nf = Enum.Parse(typeof<NormalizationForm>, formName) :?> NormalizationForm
let sn = normalizeStrings nf [| s1; s2; s3|]
testForEquality sn
sw.WriteLine "\n"
// The example displays the following output:
// sống (0073 1ED1 006E 0067) = sống (0073 00F4 0301 006E 0067): False
// sống (0073 1ED1 006E 0067) = sống (0073 006F 0302 0301 006E 0067): False
// sống (0073 00F4 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): False
//
// Normalization FormC:
//
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
//
//
// Normalization FormD:
//
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
//
//
// Normalization FormKC:
//
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
// sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
//
//
// Normalization FormKD:
//
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
// sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
Imports System.Globalization
Imports System.IO
Imports System.Text
Module Example16
Private sw As StreamWriter
Public Sub Main()
sw = New StreamWriter(".\TestNorm1.txt")
' Define three versions of the same word.
Dim s1 As String = "sống" ' create word with U+1ED1
Dim s2 As String = "s" + ChrW(&HF4) + ChrW(&H301) + "ng"
Dim s3 As String = "so" + ChrW(&H302) + ChrW(&H301) + "ng"
TestForEquality(s1, s2, s3)
sw.WriteLine()
' Normalize and compare strings using each normalization form.
For Each formName In [Enum].GetNames(GetType(NormalizationForm))
sw.WriteLine("Normalization {0}:", formName)
Dim nf As NormalizationForm = CType([Enum].Parse(GetType(NormalizationForm), formName),
NormalizationForm)
Dim sn() As String = NormalizeStrings(nf, s1, s2, s3)
TestForEquality(sn)
sw.WriteLine(vbCrLf)
Next
sw.Close()
End Sub
Private Sub TestForEquality(ParamArray words As String())
For ctr As Integer = 0 To words.Length - 2
For ctr2 As Integer = ctr + 1 To words.Length - 1
sw.WriteLine("{0} ({1}) = {2} ({3}): {4}",
words(ctr), ShowBytes(words(ctr)),
words(ctr2), ShowBytes(words(ctr2)),
words(ctr).Equals(words(ctr2), StringComparison.Ordinal))
Next
Next
End Sub
Private Function ShowBytes(str As String) As String
Dim result As String = Nothing
For Each ch In str
result += String.Format("{0} ", Convert.ToUInt16(ch).ToString("X4"))
Next
Return result.Trim()
End Function
Private Function NormalizeStrings(nf As NormalizationForm, ParamArray words() As String) As String()
For ctr As Integer = 0 To words.Length - 1
If Not words(ctr).IsNormalized(nf) Then
words(ctr) = words(ctr).Normalize(nf)
End If
Next
Return words
End Function
End Module
' The example displays the following output:
' sống (0073 1ED1 006E 0067) = sống (0073 00F4 0301 006E 0067): False
' sống (0073 1ED1 006E 0067) = sống (0073 006F 0302 0301 006E 0067): False
' sống (0073 00F4 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): False
'
' Normalization FormC:
'
' sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
' sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
' sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
'
'
' Normalization FormD:
'
' sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
' sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
' sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
'
'
' Normalization FormKC:
'
' sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
' sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
' sống (0073 1ED1 006E 0067) = sống (0073 1ED1 006E 0067): True
'
'
' Normalization FormKD:
'
' sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
' sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
' sống (0073 006F 0302 0301 006E 0067) = sống (0073 006F 0302 0301 006E 0067): True
Normalleştirme ve normalleştirme formları hakkında daha fazla bilgi için unicode.org web sitesindeki Unicode Standart Ek 15: Unicode Normalleştirme Formları ve Normalleştirme SSS bölümüne bakınSystem.Text.NormalizationForm.
Kategoriye göre dize işlemleri
String sınıfı dizeleri karşılaştırmak, dizeleri eşitlik için test etme, dizedeki karakterleri veya alt dizeleri bulma, dizeyi değiştirme, dizeden alt dize ayıklama, dizeleri birleştirme, değerleri biçimlendirme, dizeyi kopyalama ve bir dizeyi normalleştirme için üyeler sağlar.
Dizeleri karşılaştırma
Aşağıdaki String yöntemleri kullanarak dizeleri karşılaştırarak sıralama düzenindeki göreli konumlarını belirleyebilirsiniz:
Compare , bir dizenin sıralama düzenindeki ikinci bir dizeyle ilişkisini gösteren bir tamsayı döndürür.
CompareOrdinal , kod noktalarının karşılaştırmasına göre bir dizenin ikinci bir dizeyle ilişkisini gösteren bir tamsayı döndürür.
CompareTo geçerli dize örneğinin sıralama düzenindeki ikinci bir dizeyle ilişkisini gösteren bir tamsayı döndürür. yöntemi, CompareTo(String) sınıfı için String ve IComparable<T> uygulamalarını sağlarIComparable.
Eşitlik için dizeleri test edin
İki dizenin Equals eşit olup olmadığını belirlemek için yöntemini çağırırsınız. Örnek Equals(String, String, StringComparison) ve statik Equals(String, StringComparison) aşırı yüklemeler, karşılaştırmanın kültüre duyarlı mı yoksa sıralı mı olduğunu ve büyük/küçük harf dikkate alınıp alınmayacağını veya yoksayılacağını belirtmenize olanak tanır. Eşitlik testlerinin çoğu sıralıdır ve bir sistem kaynağına (dosya sistemi nesnesi gibi) erişimi belirleyen eşitlik karşılaştırmaları her zaman sıralı olmalıdır.
Dizedeki karakterleri bulma
String sınıfı iki tür arama yöntemi içerir:
Belirli bir alt dizenin bir Boolean dize örneğinde mevcut olup olmadığını göstermek için bir değer döndüren yöntemler. Bunlar , EndsWithve StartsWith yöntemlerini içerirContains.
Bir dize örneğindeki bir alt dizenin başlangıç konumunu gösteren yöntemler. Bunlar , , IndexOfAnyLastIndexOfve LastIndexOfAny yöntemlerini içerirIndexOf.
Uyarı
Belirli bir alt dize yerine belirli bir desen için bir dizede arama yapmak istiyorsanız, normal ifadeler kullanmalısınız. Daha fazla bilgi için bkz . .NET Normal İfadeleri.
Dizeyi değiştirme
sınıfı, String bir dizenin değerini değiştirmek için görünen aşağıdaki yöntemleri içerir:
PadLeft bir dizenin başına belirtilen bir karakterin bir veya daha fazla tekrarını ekler.
PadRight bir dizenin sonuna belirtilen bir karakterin bir veya daha fazla tekrarını ekler.
Replace bir alt dizeyi geçerli String örnekteki başka bir alt dizeyle değiştirir.
ToLower ve ToLowerInvariant bir dizedeki tüm karakterleri küçük harfe dönüştürün.
ToUpper ve ToUpperInvariant bir dizedeki tüm karakterleri büyük harfe dönüştürün.
Trim bir karakterin dizenin başından ve sonundan tüm oluşumlarını kaldırır.
TrimEnd bir karakterin dizenin sonundan tüm oluşumlarını kaldırır.
TrimStart bir karakterin tüm oluşumlarını dizenin başından kaldırır.
Önemli
Tüm dize değiştirme yöntemleri yeni String bir nesne döndürür. Geçerli örneğin değerini değiştirmezler.
Dizeden alt dizeleri ayıklama
yöntemi tek String.Split bir dizeyi birden çok dizeye ayırır. yönteminin aşırı yüklemeleri, yöntemin ayıkladığı alt dize sayısını sınırlamak, alt dizelerdeki boşlukları kırpmak ve boş dizelerin (sınırlayıcılar bitişik olduğunda gerçekleşir) döndürülen dizeler arasına eklenip eklenmeyeceğini belirtmek için birden çok sınırlayıcı belirtmenize olanak sağlar.
Dizeleri birleştirme
Dize birleştirme için aşağıdaki String yöntemler kullanılabilir:
- Concat bir veya daha fazla alt dizeyi tek bir dizede birleştirir.
- Join bir veya daha fazla alt dizeyi tek bir öğede birleştirir ve her alt dize arasına bir ayırıcı ekler.
Değerleri biçimlendirme
yöntemi, String.Format bir dizedeki bir veya daha fazla yer tutucuyu bir nesnenin veya değerin dize gösterimiyle değiştirmek için bileşik biçimlendirme özelliğini kullanır. Format yöntemi genellikle aşağıdakileri yapmak için kullanılır:
- Sayısal değerin dize gösterimini bir dizeye eklemek için.
- Bir tarih ve saat değerinin dize gösterimini bir dizeye eklemek için.
- Bir sabit listesi değerinin dize gösterimini bir dizeye eklemek için.
- Bir dizedeki arabirimi destekleyen bazı nesnenin dize gösterimini IFormattable eklemek için.
- Daha büyük bir dize içindeki bir alanda alt dizeyi sağa yaslama veya sola yaslama için.
Biçimlendirme işlemleri ve örnekler hakkında ayrıntılı bilgi için bkz Format . aşırı yükleme özeti.
Dize kopyalama
Bir dizenin kopyasını oluşturmak için aşağıdaki String yöntemleri çağırabilirsiniz:
- Clone var olan String bir nesneye başvuru döndürür.
- CopyTo dizenin bir bölümünü karakter dizisine kopyalar.
Dizeyi normalleştirme
Unicode'da tek bir karakter birden çok kod noktasına sahip olabilir. Normalleştirme, bu eşdeğer karakterleri aynı ikili gösterime dönüştürür. String.Normalize yöntemi normalleştirmeyi gerçekleştirir ve yöntemi bir dizenin String.IsNormalized normalleştirilip normalleştirilmeyeceğini belirler.
Daha fazla bilgi ve örnek için bu makalenin önceki bölümlerindeki Normalleştirme bölümüne bakın.