C#如何以排序数组的形式获取哈希表元素

C#如何以排序数组的形式获取哈希表元素

哈希表是一个非通用的键值对的集合,这些键值对按照键的哈希代码排列。Hashtable是用来创建一个使用哈希表进行存储的集合。哈希表通过计算每个键的哈希代码来优化查找,并在内部将其存储到一个篮子里。当我们从hashtable中访问特定的值时,这个哈希码会与指定的键相匹配。

这个hashtable集合被定义在C#的System.Collections命名空间中。代表hashable集合的类是 “Hashtable “类。这个类提供了构造函数、方法和属性来操作hashable集合。默认情况下,hashtable集合是没有排序的。如果我们想要一个排序的hashtable集合,我们需要以数组或ArrayList的形式来表示它,并对元素进行排序。

在这篇文章中,我们将看到如何将hashtable元素作为一个排序的数组获得。那么我们开始吧。

以排序数组的形式获取哈希表元素

我们知道,默认情况下,hashtable集合是没有排序的。要对hashtable集合进行排序可能非常困难,因为我们根据键来创建hashtable集合,然后给每个键添加值。

如果我们想对hashtable集合进行排序,我们必须对它的键或值进行排序。在Hashtable类中没有直接的方法来对hashtable集合进行排序。所以我们必须求助于其他方法。

其中一种方法是将hashtable元素(无论是键还是值)作为一个排序的数组来获取。为此,我们将遵循下面列举的步骤。

  • 创建一个Hashtable对象

  • 用键值对来填充这个对象

  • 创建一个字符串类型的数组,长度=hashtable的长度

  • 根据键值遍历hashtable,并将每个键值填充到数组中。

  • 对生成的数组进行排序

示例

我们用C#语言对这种方法进行了编程,具体内容如下。

using System;
using System.Collections;
class Program {
   public static void Main() {

      // Create a Hashtable
      Hashtable langCodes = new Hashtable();

      // Add elements to the Hashtable
      langCodes.Add("C++", "CPlusPlus");
      langCodes.Add("C#", "CSharp");
      langCodes.Add("Java", "Java");
      langCodes.Add("PL", "Perl");
      langCodes.Add("PG", "Prolog");
      int k = langCodes.Count;

      // create array of length = hashtable length
      string[] sortedArray = new string[k];

      // Retrieve key values in Array
      int i = 0;
      Console.WriteLine("Hashtable langCodes Contents:");
      foreach (DictionaryEntry de in langCodes) {
         Console.WriteLine("{0} ({1}) ", de.Key, de.Value);
         sortedArray[i] = de.Key.ToString();
         i++;
      }
      Array.Sort(sortedArray);
      Console.WriteLine("  
Contents of sorted array based on Hashtable keys:");
      foreach (var item in sortedArray) {
         Console.WriteLine(item);
      }
   }
}

在这个程序中,我们定义了一个Hashtable对象langCodes,并用键值对来填充它。然后我们检索hashtable的长度,并用这个长度声明一个数组 “sortedArray”。接下来,我们遍历langCodes hashtable,用langCodes hashtable的键值填充排序的数组对象。

然后我们用过滤器对数组进行排序,Array.Sort(sortedArray)并打印这个排序的数组。

输出

该程序的输出结果如下。

Hashtable langCodes Contents:
PG (Prolog) 
Java (Java) 
C# (CSharp) 
PL (Perl) 
C++ (CPlusPlus) 
Contents of sorted array based on Hashtable keys:
C#
C++
Java
PG
PL

从输出中,我们可以看到,hashtable的关键元素被检索为一个排序的元素阵列。

现在让我们再举一个例子。我们使用上面讨论的同样的方法。唯一不同的是,在这个例子中,我们将用值来填充数组,而不是用hashtable中的键。

示例

让我们看看C#中的完整程序。

using System;
using System.Collections;
class Program {
   public static void Main() {
      // Create a Hashtable
      Hashtable numberNames = new Hashtable();

      // Add elements to the Hashtable
      numberNames.Add(12, "Twelve");
      numberNames.Add(2, "Two");
      numberNames.Add(65, "Sixty Five");
      numberNames.Add(15, "Fifteen");
      numberNames.Add(18, "Eighteen");
      int k = numberNames.Count;

      //create array of length = hashtable length
      string[] sortedArray = new string[k];

      // Retrieve hashtable values in array.
      int i = 0;
      Console.WriteLine("Hashtable langCodes Contents:");
      foreach (DictionaryEntry de in numberNames) {
         Console.WriteLine("{0} ({1}) ", de.Key, de.Value);
         sortedArray[i] = de.Value.ToString();
         i++;
      }
      Array.Sort(sortedArray);
      Console.WriteLine("  
Contents of sorted array based on Hashtable values:");
      foreach (var item in sortedArray) {
         Console.WriteLine(item);
      }
   }
}

这个程序有一个Hashtable对象,numberNames。我们用数字和它们相应的数字名称来填充它。通过遍历hashtable,我们将数值填充到sortedArray中。然后我们使用Array.Sort()过滤器对数组进行排序,并打印排序后的数组。

输出

该程序的输出结果如下所示。

Hashtable langCodes Contents:
18 (Eighteen) 
12 (Twelve) 
65 (Sixty Five) 
2 (Two) 
15 (Fifteen) 
Contents of sorted array based on Hashtable values:
Eighteen
Fifteen
Sixty Five
Twelve
Two

从输出中,我们可以看到数组的内容(来自hashtable的值)确实是按字母顺序排序的。我们可以很容易地比较hashtable和排序后的数组的输出。在hashtable中,输出是没有排序的。键值对是随机显示的。而在数组中,输出是被排序的。

尽管对hashtable元素进行排序很困难,但我们可以通过将hashtable元素表达为数组来进行排序。但是一次对键和值进行排序是不可能的。我们可以检索一个数组中的所有键或数组中的所有值。然后我们可以使用Array.Sort()过滤器对数组进行排序。我们也可以将hashtable转换为Arrays或ArrayLists并对其进行处理。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程