本文章是由機器翻譯。 將指標移到文章內的文字上方即可查看原文。 其他資訊。
譯文
原文
資訊
The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.

SortKey 類別

表示將字串對應至其排序鍵的結果。

System.Object
  System.Globalization.SortKey

命名空間:  System.Globalization
組件:  mscorlib (在 mscorlib.dll 中)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class SortKey

SortKey 類型會公開下列成員。

  名稱描述
公用屬性KeyData取得表示目前 SortKey 物件的位元組陣列。
公用屬性OriginalString取得用來建立目前 SortKey 物件的原始字串。
回頁首

  名稱描述
公用方法靜態成員Compare比較兩個排序鍵。
公用方法Equals判斷指定的物件是否等於目前的 SortKey 物件。 (覆寫 Object.Equals(Object)。)
受保護的方法Finalize 允許物件在記憶體回收進行回收之前,嘗試釋放資源並執行其他清除作業。 (繼承自 Object)。
公用方法GetHashCode做為目前 SortKey 物件的雜湊函式,亦即適用於雜湊演算法和資料結構 (如雜湊表)。 (覆寫 Object.GetHashCode()。)
公用方法GetType取得目前執行個體的 Type (繼承自 Object)。
受保護的方法MemberwiseClone建立目前 Object 的淺層複本 (Shallow Copy)。 (繼承自 Object)。
公用方法ToString傳回表示目前 SortKey 物件的字串。 (覆寫 Object.ToString()。)
回頁首

兩個字串間區分文化特性的比較,取決於各字串中的字元是否有許多排序權重分類,包括指令碼、字母順序、大小寫和變音符號權重。 排序鍵可以當做特定字串的這些權重的存放庫。 SortKey 物件的值便是其索引鍵資料,它是一系列對字串、特定文化特性排序規則和指定使用者比較選項進行編碼的位元組。 使用排序鍵進行的比較會包括對各排序鍵中對應的索引鍵資料進行位元比較。

CompareInfo.GetSortKey 方法會傳回反映文化特性的對應字元中指定字串的 SortKey 類別的執行個體。 排序鍵的 SortKey.KeyData 屬性為包含排序鍵的資料並反映目前文化特性的慣例,以及任何於建立索引鍵時指定的使用者定義的 CompareOptions 的位元組陣列。 例如,如果您使用 CompareOptions.IgnoreCase值呼叫 GetSortKey(String, CompareOptions) 方法建立分類,使用排序鍵的字串比較作業不區分大小寫。

在建立字串的排序鍵後,您可以呼叫靜態 SortKey.Compare 方法比較排序鍵。 這個方法會執行簡單的位元組逐一比較,因此速度要比使用 String.CompareCompareInfo.Compare 快得多。

效能考量

當執行字串比較時, CompareCompareInfo.Compare 方法會產生相同的結果,但是針對不同的案例。

作用上,CompareInfo.Compare 方法會為各字串產生排序鍵、執行比較,然後捨棄排序鍵並傳回比較結果。 不過, CompareInfo.Compare 方法不會產生整個排序鍵執行比較。 而是,方法會為各個字串中的各個文字項目 (即基底字元、Surrogate 字組或組合字元序列) 產生索引鍵資料。 方法接著會比較對應文字項目的索引鍵資料。 一旦決定了比較的最後結果,隨即終止作業。 雖然會計算排序鍵資訊,但並不會建立任何 SortKey 物件。 如果同時比較兩個字串,就效能來說此策略可節省資源,但多次比較相同的字串時,則會高度耗費資源。

Compare 方法在執行比較前,需要為各字串產生 SortKey 物件。 就第一次比較的效能而言,這個策略是用來產生 SortKey 物件的時間和記憶體會高度耗費資源。 不過,如果多次比較相同的排序鍵,則可節省資源。

例如,假設您撰寫了一個應用程式,要在資料庫資料表中搜尋其字串架構的索引資料行與指定的搜尋字串相符的資料列。 因為這份資料表包含成千上萬個資料列,所以比較搜尋字串與各資料列的索引需要很長的時間。 因此,當應用程式儲存資料列和其索引資料行時,也會為資料行中的索引產生並儲存排序鍵,藉以改善搜尋效能。 應用程式在搜尋目標資料列時,會比較搜尋字串的排序鍵與索引字串的排序鍵,而不會比較搜尋字串與索引字串。

安全性考量

CompareInfo.GetSortKey(String, CompareOptions) 方法會傳回 SortKey 物件,這個物件的值是根據所指定字串和 CompareOptions 值,而其文化特性 (Culture) 與基礎 CompareInfo 物件相關聯。 如果安全性決策取決於字串比較或大小寫變更作業,則無論作業系統的文化特性設定為何,您都應該使用非變異文化特性的 CompareInfo.GetSortKey(String, CompareOptions) 方法,以確保作業行為一致。

使用下列步驟取得排序鍵:

  1. CultureInfo.InvariantCulture 屬性擷取不因文化特性而異的文化特性。

  2. CultureInfo.CompareInfo 屬性擷取不因文化特性而異的 CompareInfo 物件。

  3. 呼叫 CompareInfo.GetSortKey(String, CompareOptions) 方法。

使用 SortKey 物件的值相當於呼叫已指定 LCMAP_SORTKEY 值的 Windows LCMapString 方法。 然而,如果是 SortKey 物件,則,英文字元排序鍵的順序會比韓國字元排序鍵要優先。

SortKey 物件可以序列化,但只讓它們可以跨 AppDomain 物件。 如果應用程式會序列化 SortKey 物件,則應用程式必須在有新版本的 .NET Framework 時重新產生所有的排序鍵。

如需排序鍵的詳細資訊,請參閱位於 Unicode Consortium 的 Unicode Technical Standard #10。

下列範例會使用 "en-US" 和 "es-ES" 文化特性,以及 "en-US" 和 "es-ES" 傳統文化特性,比較 "llama" 字串。


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
*/



下列範例示範如何使用 SortKey 類別來改善廣泛仰賴排序及搜尋大型陣列之應用程式的效能。 這個範例會建立未排序的名稱,在此案例中有 13 個項目。 它在平行陣列儲存每個排序鍵的名稱,會傳遞至 Array.Sort(Array, Array) 方法。 結果是已排序陣列。 這個範例會搜尋陣列的三個字串。 對於每個搜尋字串,它會呼叫 CompareInfo.GetSortKey(String, CompareOptions) 方法擷取字串排序索引鍵,然後呼叫 Array.FindIndex 方法來擷取該排序輸入索引陣列排序鍵。 由於名稱和排序鍵陣列是平行的,傳回的索引也是名稱索引在 names 陣列中。


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


.NET Framework

支援版本:4.5.2、4.5.1、4.5、4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

支援版本:4、3.5 SP1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (不支援伺服器核心角色), Windows Server 2008 R2 (SP1 (含) 以後版本支援伺服器核心角色,不支援 Itanium)

.NET Framework 並不支援各種平台的所有版本。如需支援版本的清單,請參閱.NET Framework 系統需求

這個類型的任何 Public static (在 Visual Basic 中為 Shared) 成員都是安全執行緒。不保證任何執行個體成員是安全執行緒。

社群新增項目

顯示:
© 2015 Microsoft