Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tavsiye
Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Programlamaya yeni başladıysanız ilk olarak Başlangıç öğreticileri ile başlayın.
Başka bir dilden mi geliyorsunuz? C# dilinde dizelerde ==, Java'nın equals veya JavaScript'in === işleçlerinde olduğu gibi, referansları değil değerleri karşılaştırır. Temel fark, C# dilinin StringComparison değeri üzerinden ordinal (ikili) ve kültüre duyarlı karşılaştırma arasında seçim yapmanıza olanak tanımasıdır.
Dizeleri iki sorudan birini yanıtlamak için karşılaştırırsınız: Bu iki dize eşit mi? veya Bu dizeler hangi sırada sıralanıyor? C# iki soruyu yanıtladığınızda iki bağımsız faktörü denetlemenizi sağlar:
-
Büyük/küçük harf duyarlılığı —
"Hello"ile"hello"eşit kabul edilip edilmediği. - Karşılaştırma türü — sıralı (her karakterin ikili değerini karşılaştırın) veya kültüre duyarlı (bir kültürün dil kurallarını uygulayın).
Numaralandırma, StringComparison bu faktörleri karşılaştırma yöntemlerine geçirdiğiniz tek bir değerde birleştirir.
Eşitlik için karşılaştır
String.Equals yöntemi ve == işleci, varsayılan olarak büyük/küçük harfe duyarlı, ordinal bir karşılaştırma yapar. Sıralı karşılaştırma, her karakterin ikili değerini denetler, böylece hızlıdır ve her makinede aynı sonucu verir.
StringComparison değeri alan aşırı yüklemeyi çağırarak amacınızı açıkça belirtebilirsiniz:
string root = @"C:\users";
string root2 = @"C:\Users";
// Equals and == both perform a case-sensitive, ordinal comparison.
Console.WriteLine(root.Equals(root2));
// => False
Console.WriteLine(root == root2);
// => False
// Pass a StringComparison value to state the intent explicitly.
Console.WriteLine(root.Equals(root2, StringComparison.Ordinal));
// => False
Sıralı semantiği koruyarak büyük/küçük harf duyarlılığını yok saymak için StringComparison.OrdinalIgnoreCase iletin:
string root = @"C:\users";
string root2 = @"C:\Users";
// OrdinalIgnoreCase compares the binary values but ignores case.
bool equalIgnoringCase = string.Equals(root, root2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine(equalIgnoringCase);
// => True
Sıralama düzeni için karşılaştır
Eşitlik yerine sıralama düzenini belirlemek için kullanın String.Compare. İlk dizenin önce, ikinciyle aynı konumda mı yoksa ikinciden sonra mı sıralanacağını belirtmek için negatif bir sayı, sıfır veya pozitif bir sayı döndürür:
string first = "Avocado";
string second = "Banana";
// Compare returns a negative number, zero, or a positive number
// to indicate sort order. Specify the comparison type explicitly.
int order = string.Compare(first, second, StringComparison.Ordinal);
Console.WriteLine(order < 0
? $"'{first}' sorts before '{second}'."
: $"'{first}' sorts at or after '{second}'.");
// => 'Avocado' sorts before 'Banana'.
Important
Compare ve CompareTo, varsayılan olarak kültüre duyarlı bir karşılaştırma kullanırken, Equals ve == varsayılan olarak ordinal karşılaştırma kullanır. Sürprizlerden kaçınmak için, kodunuzun hangi davranışı istediğini belirtmesi için açık StringComparison bir değer geçirin.
Desen eşleştirmeyle is veya switch kullanarak sabitlerle karşılaştırın
Karşılaştırdığınız değer sabit olduğunda, is işlecini, bir sabit desenle== için okunaklı bir alternatif olarak kullanabilirsiniz:
string status = "Ready";
// When the right operand is a constant, the is operator and a
// constant pattern read as an alternative to ==.
if (status is "Ready")
{
Console.WriteLine("The system is ready.");
}
// => The system is ready.
Bir dizeyi birkaç sabitle karşılaştırmak için bir switch ifade kullanın. Her kol sabit bir deseni test eder ve atma deseni (_) eşleşmeyen her değeri işler. Sonraki örnek, bir yön anahtar sözcüğünü bir seyahat yönergesine eşler:
foreach (string heading in new[] { "North", "South", "East", "West", "NE" })
{
// A switch expression matches each constant pattern in turn and
// returns the first match. The discard (_) handles every other value.
string instruction = heading switch
{
"North" => "Travel due North for 10 km.",
"South" => "Travel due South for 10 km.",
"East" => "Travel due East for 10 km.",
"West" => "Travel due West for 10 km.",
_ => $"Unknown heading: {heading}.",
};
Console.WriteLine(instruction);
}
// => Travel due North for 10 km.
// => Travel due South for 10 km.
// => Travel due East for 10 km.
// => Travel due West for 10 km.
// => Unknown heading: NE.
switch dize sabitlerini sınayan bir ifade, == ile aynı büyük/küçük harfe duyarlı ordinal karşılaştırmayı gerçekleştirir; bu nedenle "north", "North" koluyla eşleşmez.
Doğru karşılaştırmayı seçin
Karşılaştırma türünü alışkanlığa göre değil, verilere göre seçin:
- Tanımlayıcılar, dosya yolları, protokol belirteçleri ve makine tarafından tanımlanan diğer metinler için Ordinal kullanın (veya büyük/küçük harf ayrımını yok saymak için OrdinalIgnoreCase kullanın). Sıralı karşılaştırma, kültürler arasında hızlı ve tutarlıdır.
- Kullanıcıların okuduğu ve sıraladığı adlar veya ürün başlıkları gibi metinlerde, sıralamanın kullanıcının beklentileriyle eşleşmesi için CurrentCulture kullanın.
Kültüre duyarlı karşılaştırma, kültüre göre farklılık gösteren ve şaşırtıcı sonuçlara neden olabilecek dil kuralları uygular. Örneğin, bazı kültürlerde "ss" ve "ß" eşit kabul edilir ve dizelerin sırası makineler arasında değişebilir. Bu değişkenlik nedeniyle, orijinal doğal dil metni için kültüre duyarlı karşılaştırmayı rezerve edin ve bir koleksiyonu her sıraladığınızda ve aradığınızda aynı karşılaştırma türünü kullanın.
Genelleştirme konuları ve platform farklılıkları da dahil olmak üzere kültüre duyarlı karşılaştırmanın ayrıntılı bir şekilde ele alınması için bkz. .NET dizeleri karşılaştırmak için en iyi yöntemler.