此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Array.Sort<T> 方法 (T[], IComparer<T>)

2013/12/13

使用指定的 IComparer<T> 泛型接口,对 Array 中的元素进行排序。

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public static void Sort<T>(
	T[] array,
	IComparer<T> comparer
)

类型参数

T

数组元素的类型。

参数

array
类型: T []
要排序的从零开始的一维 Array
comparer
类型: System.Collections.Generic.IComparer<T>
比较元素时使用的 IComparer<T> 泛型接口实现;如果为 null,则使用每个元素的 IComparable<T> 泛型接口实现。

异常条件
ArgumentNullException

arraynull

InvalidOperationException

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

ArgumentException

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

如果 comparernull,则 array 中的每个元素均必须实现 IComparable<T> 泛型接口,才能与 array 中的其他所有元素进行比较。

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

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

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

下面的代码示例演示 Sort<T>(T[], IComparer<T>) 泛型方法重载和 BinarySearch<T>(T[], T, IComparer<T>) 泛型方法重载。

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

显示数组并进行排序,然后进行再次显示。在使用 BinarySearch 方法之前,必须对数组进行排序。

说明注意:

调用 Sort<T>(T[], IComparer<T>)BinarySearch<T>(T[], T, IComparer<T>) 泛型方法与调用对应的非泛型方法没什么分别,因为 Visual Basic、C# 和 C++ 都是从第一个参数的类型推断泛型类型参数的类型。

然后使用 BinarySearch<T>(T[], T, IComparer<T>) 泛型方法重载搜索两个字符串,一个不在数组中,而另一个在数组中。将数组和 BinarySearch<T>(T[], T, IComparer<T>) 方法的返回值传递给 ShowWhere 泛型方法,该方法在找到字符串时显示索引值;否则显示搜索字符串将介于其间的元素(假设字符串在数组中)。如果字符串不在数组中,则索引为负,因此 ShowWhere 方法会采用按位求补(在 C# 和 Visual C++ 中使用 ~ 运算符,在 Visual Basic 中使用 Xor -1),以获得列表中大于搜索字符串的第一个元素的索引。


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 = {"Pachycephalosaurus", 
                              "Amargasaurus", 
                              "Tyrannosaurus", 
                              "Mamenchisaurus", 
                              "Deinonychus", 
                              "Edmontosaurus"};

      outputBlock.Text += "\n";
      foreach (string dinosaur in dinosaurs)
      {
         outputBlock.Text += dinosaur + "\n";
      }

      ReverseComparer rc = new ReverseComparer();

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

      outputBlock.Text += "\n";
      foreach (string dinosaur in dinosaurs)
      {
         outputBlock.Text += dinosaur + "\n";
      }

      outputBlock.Text += "\nBinarySearch for 'Coelophysis':" + "\n";
      int index = Array.BinarySearch(dinosaurs, "Coelophysis", rc);
      ShowWhere(outputBlock, dinosaurs, index);

      outputBlock.Text += "\nBinarySearch for 'Tyrannosaurus':" + "\n";
      index = Array.BinarySearch(dinosaurs, "Tyrannosaurus", rc);
      ShowWhere(outputBlock, dinosaurs, index);
   }

   private static void ShowWhere<T>(System.Windows.Controls.TextBlock outputBlock, T[] array, int index)
   {
      if (index < 0)
      {
         // If the index is negative, it represents the bitwise
         // complement of the next larger element in the array.
         //
         index = ~index;

         outputBlock.Text += "Not found. Sorts between: ";

         if (index == 0)
            outputBlock.Text += "beginning of array and ";
         else
            outputBlock.Text += String.Format("{0} and ", array[index - 1]);

         if (index == array.Length)
            outputBlock.Text += "end of array." + "\n";
         else
            outputBlock.Text += String.Format("{0}.", array[index]) + "\n";
      }
      else
      {
         outputBlock.Text += String.Format("Found at index {0}.", index) + "\n";
      }
   }
}

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Tyrannosaurus
Mamenchisaurus
Deinonychus
Edmontosaurus

Sort

Tyrannosaurus
Pachycephalosaurus
Mamenchisaurus
Edmontosaurus
Deinonychus
Amargasaurus

BinarySearch for 'Coelophysis':
Not found. Sorts between: Deinonychus and Amargasaurus.

BinarySearch for 'Tyrannosaurus':
Found at index 0.
 */


Windows Phone OS

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

Windows Phone

显示:
© 2015 Microsoft