2014-02-06 71 views
3
public static Hashtable Drinks = new Hashtable(); 
Drinks["Water"] = 3; 
Drinks["Coffee"] = 2 
Drinks["Beer"] = 5; 

爲了得到我使用的物品的價值: int drink =(int)Drinks [「Water」];它的工作原理是 。散列表按位置檢索值?

我想知道我該如何做這項工作。 pCardValue1 =(int)card [1];

贊,而不是輸入項目名稱我想按位置獲取值。

+0

你可以使用Linq將你的Hashtable轉換成List 然後獲取必需的項目;但是Hashtable並不是一個好的集合,需要解決這個問題 –

+0

您是否需要通過索引查找元素(鍵和值)的可能性,或者您是否希望能夠:a)通過鍵來查找值b)按值鍵?第二個選項默認情況下不存在,我認爲你必須通過慢搜索來實現它('List '和linq搜索),或者更慢的插入(兩個'Hashtable',其中一個是鍵值其次是值鍵,只有當你不允許重複值時纔可能)。另外檢查[this](http://stackoverflow.com/questions/1171812/multi-key-dictionary-in-c)。 – Sinatr

回答

3

Hashtable(和Dictionary)類沒有排序,這意味着它的條目沒有任何順序或位置,並且即使您得到一個鍵列表,順序也是隨機的。如果您想通過鍵和位置獲取值,則應使用OrderedDictionary集合。

+0

你可以給我一個OrderedDictionary的例子。 – Do0med

+0

nvm感謝D: – Do0med

3

您需要一個OrderedDictionaryHashTable未訂購。

還要注意的是HashTable不應在生產代碼從框架2.0使用的,還有一個Dictionary<TKey,TValue>System.Collections.Generic命名空間是用於HashTable更換並提供泛型。

0

您可以使用linq技巧獲取物品名稱的位置。

int position = 1; 
var a1 = (from DictionaryEntry entry in Drinks select entry.Key).Skip(position).FirstOrDefault(); 

如果要通過價值項目名稱,然後用

object value = 2; 
var a = (from DictionaryEntry entry in Drinks where entry.Value.Equals(value) select entry.Key).FirstOrDefault(); 
1

前面已經提到的,你應該使用OrderedDictionary。由於您在評論中請求了一個示例,因此可以這樣做:

var stringKey = "stringKey"; 
      var stringValue = "stringValue"; 

      var objectKey = "dateTimeKey"; 
      var objectValue = DateTime.Now; 

      var dict = new OrderedDictionary(); 
      dict.Add(stringKey, stringValue); 
      dict.Add(objectKey, objectValue); 

      for (int i = 0; i < dict.Count; i++) 
      { 
       var value = dict[i]; 
      } 

枚舉字典多次將按相同的順序返回結果。請注意,由於它接受了鍵和值的對象,因此可以根據需要混合不同的類型,這意味着在使用結構時必須小心。