此主题尚未评级 - 评价此主题

Array.Sort<TKey, TValue> 方法 (TKey[], TValue[], Int32, Int32, IComparer<TKey>)

2013/12/13

基于第一个 Array 中的关键字,使用指定的 IComparer<T> 泛型接口,对两个 Array 对象(一个包含关键字,另一个包含对应的项)的部分元素进行排序。

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)
public static void Sort<TKey, TValue>(
	TKey[] keys,
	TValue[] items,
	int index,
	int length,
	IComparer<TKey> comparer
)

类型参数

TKey

关键字数组元素的类型。

TValue

项数组元素的类型。

参数

keys
类型: TKey []
从零开始的一维 Array,它包含要排序的关键字。
items
类型: TValue []
从零开始的一维 Array,其中包含与 keys 中的关键字对应的项;如果为 null,则只对 keys 进行排序。
index
类型: System.Int32
排序范围的起始索引。
length
类型: System.Int32
排序范围内的元素数。
comparer
类型: System.Collections.Generic.IComparer<TKey>
比较元素时使用的 IComparer<T> 泛型接口实现;如果为 null,则使用每个元素的 IComparable<T> 泛型接口实现。
异常条件
ArgumentNullException

keysnull

ArgumentOutOfRangeException

index 小于 keys 的下限。

- 或 -

length 小于零。

ArgumentException

items 不是 null,且 keys 的下限与 items 的下限不匹配。

- 或 -

items 不是 null,并且 keys 的长度大于 items 的长度。

- 或 -

indexlength 未指定 keysArray 中的有效范围。

- 或 -

items 不为 null,并且 indexlength 未在 itemsArray 中指定有效范围。

- 或 -

comparer 的实现导致排序时出现错误。例如,将某个项与其自身进行比较时,comparer 可能不返回 0。

InvalidOperationException

comparernullkeysArray 中的一个或多个元素不实现 IComparable<T> 泛型接口。

keysArray 中的每个关键字在 itemsArray 中都有对应项。当关键字在排序过程中重新定位时,itemsArray 中的对应项也同样重新定位。因此,itemsArray 根据 keysArray 中对应关键字的排列进行排序。

如果 comparernull,则 keysArray 中指定元素范围内的每个关键字均必须实现 IComparable<T> 泛型接口,才能与其他任何关键字进行比较。

如果项数多于键数,您仍可以进行排序,但没有对应的键的项将不会被排序。如果键数多于项数,您不能进行排序,这样做会引发 ArgumentException

如果排序不能成功地完成,则结果未定义。

此方法使用 QuickSort 算法。此实现执行不稳定排序;亦即,如果两元素相等,则其顺序可能不被保留。相反,稳定排序则会保持相等元素的顺序。

一般情况下,此方法的运算复杂度为 O(n log n),其中 nlength;最坏的情况下其运算复杂度为 O(n ^ 2)。

下面的代码示例演示 Sort<TKey, TValue>(TKey[], TValue[])Sort<TKey, TValue>(TKey[], TValue[], IComparer<TKey>)Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32)Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) 泛型方法重载,这些重载用于对表示关键字和值的数组对进行排序。

该代码示例为字符串定义一个名为 ReverseCompare 的备选比较器,该比较器实现 IComparer<string>(在 Visual Basic 中为 IComparer(Of String),在 Visual C++ 中为 IComparer<String^>)泛型接口。该比较器调用 CompareTo(String) 方法,将比较数的顺序反转,以便字符串按降序而不是升序进行排序。

该代码示例创建并显示一个恐龙名称(关键字)数组和一个表示每种恐龙最大长度(以米为单位)的整数(值)数组。然后对数组进行多次排序和显示:

说明注意:

对泛型方法的调用与对其对应的非泛型方法的调用没什么分别,因为 Visual Basic、C# 和 C++ 都是从前两个参数的类型推断泛型类型参数的类型。


using System;
using System.Collections.Generic;

public class ReverseComparer : IComparer<string>
{
   public int Compare(string x, string y)
   {
      // Compare y and x in reverse order.
      return y.CompareTo(x);
   }
}

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      string[] dinosaurs = {
            "Seismosaurus", 
            "Chasmosaurus", 
            "Coelophysis", 
            "Mamenchisaurus", 
            "Caudipteryx", 
            "Cetiosaurus"  };

      int[] dinosaurSizes = { 40, 5, 3, 22, 1, 18 };

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      ReverseComparer rc = new ReverseComparer();

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes, rc)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes, rc);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes, 3, 3)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes, 3, 3);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }
   }
}

/* This code example produces the following output:

Seismosaurus: up to 40 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.

Sort(dinosaurs, dinosaurSizes)

Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Seismosaurus: up to 40 meters long.

Sort(dinosaurs, dinosaurSizes, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.
 */


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft. 版权所有。