SortKey Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Bir dizeyi sıralama anahtarına eşlemenin sonucunu temsil eder.
public ref class SortKey sealed
public ref class SortKey
public sealed class SortKey
public class SortKey
[System.Serializable]
public class SortKey
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class SortKey
type SortKey = class
[<System.Serializable>]
type SortKey = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type SortKey = class
Public NotInheritable Class SortKey
Public Class SortKey
- Devralma
-
SortKey
- Öznitelikler
Örnekler
Aşağıdaki örnek, "en-US" ve "es-ES" kültürlerini ve "en-US" ve "es-ES" geleneksel kültürlerini kullanarak "lama" dizesini karşılaştırır.
using System;
using System.Globalization;
public class SamplesSortKey {
public static void Main() {
// Creates a SortKey using the en-US culture.
CompareInfo myComp_enUS = new CultureInfo("en-US",false).CompareInfo;
SortKey mySK1 = myComp_enUS.GetSortKey( "llama" );
// Creates a SortKey using the es-ES culture with international sort.
CompareInfo myComp_esES = new CultureInfo("es-ES",false).CompareInfo;
SortKey mySK2 = myComp_esES.GetSortKey( "llama" );
// Creates a SortKey using the es-ES culture with traditional sort.
CompareInfo myComp_es = new CultureInfo(0x040A,false).CompareInfo;
SortKey mySK3 = myComp_es.GetSortKey( "llama" );
// Compares the en-US SortKey with each of the es-ES SortKey objects.
Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with international sort : {0}", SortKey.Compare( mySK1, mySK2 ) );
Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with traditional sort : {0}", SortKey.Compare( mySK1, mySK3 ) );
}
}
/*
This code produces the following output.
Comparing "llama" in en-US and in es-ES with international sort : 0
Comparing "llama" in en-US and in es-ES with traditional sort : -1
*/
Imports System.Globalization
Public Class SamplesSortKey
Public Shared Sub Main()
' Creates a SortKey using the en-US culture.
Dim myComp_enUS As CompareInfo = New CultureInfo("en-US", False).CompareInfo
Dim mySK1 As SortKey = myComp_enUS.GetSortKey("llama")
' Creates a SortKey using the es-ES culture with international sort.
Dim myComp_esES As CompareInfo = New CultureInfo("es-ES", False).CompareInfo
Dim mySK2 As SortKey = myComp_esES.GetSortKey("llama")
' Creates a SortKey using the es-ES culture with traditional sort.
Dim myComp_es As CompareInfo = New CultureInfo(&H40A, False).CompareInfo
Dim mySK3 As SortKey = myComp_es.GetSortKey("llama")
' Compares the en-US SortKey with each of the es-ES SortKey objects.
Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with international sort : {0}", SortKey.Compare(mySK1, mySK2))
Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with traditional sort : {0}", SortKey.Compare(mySK1, mySK3))
End Sub
End Class
'This code produces the following output.
'
'Comparing "llama" in en-US and in es-ES with international sort : 0
'Comparing "llama" in en-US and in es-ES with traditional sort : -1
Aşağıdaki örnekte, büyük bir diziyi SortKey sıralamaya ve aramaya dayalı bir uygulamada performansı artırmak için sınıfını nasıl kullanabileceğiniz gösterilmektedir. Örnek, bu örnekte 13 öğe içeren sıralanmamış bir ad dizisi oluşturur. Ardından her adın sıralama anahtarını yöntemine geçirdiği paralel bir dizide Sort(Array, Array) depolar. Sonuç sıralanmış bir dizidir. Örnek daha sonra dizide üç dize arar. Her arama dizesi için dizenin GetSortKey(String, CompareOptions) sıralama anahtarını almak için yöntemini çağırır ve ardından sıralama anahtarları dizisindeki bu sıralama anahtarının dizinini almak için yöntemini çağırır Array.FindIndex . Ad ve sıralama anahtarı dizileri paralel olduğundan, döndürülen dizin aynı zamanda dizideki names adın dizinidir.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
// Define names.
String[] names= { "Adam", "Ignatius", "Batholomew", "Gregory",
"Clement", "Frances", "Harold", "Dalmatius",
"Edgar", "John", "Benedict", "Paul", "George" };
SortKey[] sortKeys = new SortKey[names.Length];
CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;
for (int ctr = 0; ctr < names.Length; ctr++)
sortKeys[ctr] = ci.GetSortKey(names[ctr], CompareOptions.IgnoreCase);
// Sort array based on value of sort keys.
Array.Sort(names, sortKeys);
Console.WriteLine("Sorted array: ");
foreach (var name in names)
Console.WriteLine(name);
Console.WriteLine();
String[] namesToFind = { "Paul", "PAUL", "Wilberforce" };
Console.WriteLine("Searching an array:");
foreach (var nameToFind in namesToFind) {
SortKey searchKey = ci.GetSortKey(nameToFind, CompareOptions.IgnoreCase);
int index = Array.FindIndex(sortKeys, (x) => x.Equals(searchKey));
if (index >= 0)
Console.WriteLine("{0} found at index {1}: {2}", nameToFind,
index, names[index]);
else
Console.WriteLine("{0} not found", nameToFind);
}
}
}
// The example displays the following output:
// Sorted array:
// Adam
// Batholomew
// Benedict
// Clement
// Dalmatius
// Edgar
// Frances
// George
// Gregory
// Harold
// Ignatius
// John
// Paul
//
// Searching an array:
// Paul found at index 12: Paul
// PAUL found at index 12: Paul
// Wilberforce not found
Imports System.Globalization
Module Example
Public Sub Main()
' Define names.
Dim names() As String = { "Adam", "Ignatius", "Batholomew",
"Gregory", "Clement", "Frances",
"Harold", "Dalmatius", "Edgar",
"John", "Benedict", "Paul", "George" }
Dim sortKeys(names.Length - 1) As SortKey
Dim ci As CompareInfo = CultureInfo.CurrentCulture.CompareInfo
For ctr As Integer = 0 To names.Length - 1
sortKeys(ctr) = ci.GetSortKey(names(ctr), CompareOptions.IgnoreCase)
Next
' Sort array based on value of sort keys.
Array.Sort(names, sortKeys)
Console.WriteLine("Sorted array: ")
For Each name In names
Console.WriteLine(name)
Next
Console.WriteLine()
Dim namesToFind() As String = { "Paul", "PAUL", "Wilberforce" }
Console.WriteLine("Searching an array:")
For Each nameToFind In namesToFind
Dim searchKey As SortKey = ci.GetSortKey(nameToFind, CompareOptions.IgnoreCase)
Dim index As Integer = Array.FindIndex(sortKeys,
Function(x) x.Equals(searchKey))
If index >= 0 Then
Console.WriteLine("{0} found at index {1}: {2}", nameToFind,
index, names(index))
Else
Console.WriteLine("{0} not found", nameToFind)
End If
Next
End Sub
End Module
' The example displays the following output:
' Sorted array:
' Adam
' Batholomew
' Benedict
' Clement
' Dalmatius
' Edgar
' Frances
' George
' Gregory
' Harold
' Ignatius
' John
' Paul
'
' Searching an array:
' Paul found at index 12: Paul
' PAUL found at index 12: Paul
' Wilberforce not found
Açıklamalar
İki dizenin kültüre duyarlı karşılaştırması, dizelerdeki her karakterin betik, alfabetik, büyük/küçük harf ve aksan ağırlıkları gibi çeşitli sıralama ağırlıkları kategorisine sahip olmasına bağlıdır. Sıralama anahtarı, belirli bir dize için bu ağırlıkların deposu olarak işlev görür.
yöntemi, CompareInfo.GetSortKey belirtilen dizedeki karakterlerin SortKey kültüre duyarlı eşlemesini yansıtan sınıfın bir örneğini döndürür. Bir SortKey nesnesinin değeri, KeyData özelliği tarafından döndürülen anahtar verisidir. Bu anahtar veriler dizeyi kodlayan bir dizi bayt, kültüre özgü sıralama kuralları ve kullanıcı tarafından belirtilen karşılaştırma seçeneklerinden oluşur. Sıralama anahtarlarının kullanıldığı karşılaştırma, her sıralama anahtarındaki ilgili anahtar verilerinin bit düzeyinde karşılaştırmasını oluşturur. Örneğin, değeri GetSortKey(String, CompareOptions) olan CompareOptions.IgnoreCase yöntemini çağırarak bir sıralama anahtarı oluşturursanız, bu sıralama anahtarını kullanan bir dize karşılaştırma işlemi büyük/küçük harfe duyarsızdır.
Bir dize için sıralama anahtarı oluşturduktan sonra, statik SortKey.Compare yöntemi çağırarak sıralama anahtarlarını karşılaştırırsınız. Bu yöntem, basit bir bayt bayt karşılaştırması gerçekleştirir, bu nedenle String.Compare veya CompareInfo.Compare yöntemine göre çok daha hızlıdır.
Note
Windows işletim sistemleri için sıralama ve karşılaştırma işlemlerinde kullanılan karakter ağırlıkları, Varsayılan Unicode Harmanlama Öğesi Tablosu, Linux ve macOS için sıralama ağırlığı tablosu hakkında bilgi içeren bir dizi metin dosyası olan Sıralama Ağırlığı Tablolarını indirebilirsiniz.
Performansla ilgili dikkat edilmesi gerekenler
Dize karşılaştırması yaparken Compare ve CompareInfo.Compare yöntemleri aynı sonuçları verir, ancak farklı senaryoları hedefler.
Yöntemi, yüksek düzeyde her CompareInfo.Compare dize için sıralama anahtarını oluşturur, karşılaştırmayı gerçekleştirir ve ardından sıralama anahtarını atar ve karşılaştırmanın sonucunu döndürür. Ancak CompareInfo.Compare yöntemi, aslında karşılaştırmayı gerçekleştirmek için tam bir sıralama anahtarı üretmez. Bunun yerine yöntemi, her dizedeki her metin öğesi (temel karakter, vekil çifti veya karakter dizisini birleştirme) için anahtar verileri oluşturur. Yöntemi daha sonra ilgili metin öğelerinin anahtar verilerini karşılaştırır. Karşılaştırmanın nihai sonucu belirlendiği anda işlem sonlandırılır. Sıralama anahtarı bilgileri hesaplanır, ancak hiçbir SortKey nesne oluşturulmaz. Bu strateji, her iki dize de bir kez karşılaştırılırsa performans açısından ekonomiktir, ancak aynı dizeler birçok kez karşılaştırılırsa pahalıya dönüşür.
yöntemi, Compare karşılaştırmayı gerçekleştirmeden önce her dize için bir SortKey nesne oluşturulmasını gerektirir. Bu strateji, nesneleri oluşturmak için yatırılan zaman ve bellek nedeniyle ilk karşılaştırma için performans açısından pahalıdır SortKey . Ancak, aynı sıralama anahtarları birçok kez karşılaştırılırsa ekonomik hale gelir.
Örneğin, bir veritabanı tablosunda dize tabanlı dizin sütununun belirtilen bir arama dizesiyle eşleştiği satırı arayan bir uygulama yazdığınızı varsayalım. Tabloda binlerce satır bulunur ve arama dizesini her satırdaki dizinle karşılaştırmak uzun sürer. Bu nedenle, uygulama bir satırı ve dizin sütununu depoladığında, arama performansını geliştirmeye ayrılmış bir sütunda dizinin sıralama anahtarını da oluşturur ve depolar. Uygulama bir hedef satır ararken, arama dizesinin sıralama anahtarını, arama dizesini dizin dizesiyle karşılaştırmak yerine dizin dizesinin sıralama anahtarıyla karşılaştırır.
Güvenlik konuları
yöntemi, CompareInfo.GetSortKey(String, CompareOptions) belirtilen dizeye SortKey ve CompareOptions değere ve temel alınan CompareInfo nesneyle ilişkilendirilmiş kültüre dayalı değere sahip bir nesne döndürür. Bir güvenlik kararı bir dize karşılaştırmasına veya büyük/küçük harf değişikliğine bağlıysa, işletim sisteminin kültür ayarlarından bağımsız olarak işlemin davranışının tutarlı olmasını sağlamak için invariant kültürün CompareInfo.GetSortKey(String, CompareOptions) yöntemini kullanmanız gerekir.
Sıralama anahtarı almak için aşağıdaki adımları kullanın:
CultureInfo.InvariantCulture özelliğinden değişmeyen kültürü alın.
CompareInfo özelliğinden değişmez kültür için bir CultureInfo.CompareInfo nesnesi alın.
yöntemini çağırın CompareInfo.GetSortKey(String, CompareOptions) .
Bir SortKey nesnenin değeriyle çalışmak, Windows yöntemini belirtilen LCMAP_SORTKEY değeriyle çağırmaya LCMapString eşdeğerdir. Ancak, SortKey nesnesi için İngilizce karakterlerin sıralama anahtarları Korece karakterlerin sıralama anahtarlarından önce gelir.
SortKey nesneleri seri hale getirilebilir, ancak yalnızca AppDomain nesnelerini geçebilmek için. Bir uygulama bir SortKey nesneyi serileştirirse, .NET'in yeni bir sürümü olduğunda uygulamanın tüm sıralama anahtarlarını yeniden oluşturması gerekir.
Sıralama anahtarları hakkında daha fazla bilgi için Unicode Konsorsiyumu web sitesindeki Unicode Teknik Standart #10, "Unicode Harmanlama Algoritması" bölümüne bakın.
Özellikler
| Name | Description |
|---|---|
| KeyData |
Geçerli SortKey nesneyi temsil eden bayt dizisini alır. |
| OriginalString |
Geçerli SortKey nesneyi oluşturmak için kullanılan özgün dizeyi alır. |
Yöntemler
| Name | Description |
|---|---|
| Compare(SortKey, SortKey) |
İki sıralama anahtarını karşılaştırır. |
| Equals(Object) |
Belirtilen nesnenin geçerli SortKey nesneye eşit olup olmadığını belirler. |
| GetHashCode() |
Geçerli SortKey nesne için karma tablo gibi algoritmaları ve veri yapılarını karmalama için uygun bir karma işlevi görür. |
| GetType() |
Geçerli örneğin Type alır. (Devralındığı yer: Object) |
| MemberwiseClone() |
Geçerli Objectbasit bir kopyasını oluşturur. (Devralındığı yer: Object) |
| ToString() |
Geçerli SortKey nesneyi temsil eden bir dize döndürür. |