2014-05-12 44 views
1

我想在linq中使用散列表來獲取其值爲ABC的密鑰。 我迄今所做的:如何在Linq中使用散列表

Hashtable h=new Hashtable(); 
h.Add(1 , "ABC"); 
h.Add(2 , "AgC"); 
h.Add(3 , "ABC"); 
h.Add(4 , "AhC"); 

預期輸出:1,3(其值鍵 「ABC」)

ICollection c= h.Keys; 

var posi= from a in c 
      where h[a]="ABC" 
      select a; 

但上面的查詢不工作,並給予編譯時間錯誤。

的錯誤是:

找不到源類型「System.Collections.ICollection」的查詢模式的實現。

我在做什麼錯了?我是C#的新手。如何在LINQ中使用Hashtable?

+0

我會建議使用'Dictionary'。 [更多相關信息'Hashtable'和'Dictionary' here。](http://stackoverflow.com/questions/301371/why-is-dictionary-preferred-over-hashtable) – Loetn

回答

4

您不應該使用非一般的HashTable開始。使用通用Dictionary<int, string>代替:

var d = new Dictionary<int, string>(); 
d.Add(1 , "ABC"); 
d.Add(2 , "AgC"); 
d.Add(3 , "ABC"); 
d.Add(4 , "AhC"); 

var posi = from a in d 
      where a.Value == "ABC" 
      select a.Key; 
+0

謝謝你的答案先生,但我們如何能夠實現使用Hashtable是否一樣?在此先感謝 – user2623213

+0

而且,如果我使用group by a.Value,我得到的錯誤不能轉換爲lambda表達式。爲什麼? – user2623213

+0

如果沒有你展示如何用'group by'查詢如何查詢,怎麼可能知道? – MarcinJuraszek

2

使用Dictionary<int, string>代替了哈希表(見here爲什麼),然後執行以下操作:

var dist = new Dictionary<int, string>(); 
dist.Add(1 , "ABC"); 
dist.Add(2 , "AgC"); 
dist.Add(3 , "ABC"); 
dist.Add(4 , "AhC"); 

var keys = dist.Where(d=> d.Value == "ABC").Select(d=> d.Key); 

但如果你想Hastable,那麼請看看這個鏈接

link 1

link 2

但我的意見是,請使用Dictionary

因爲Dictionary是一個通用的集合,並且因爲沒有裝箱/取消裝箱,所以速度要快很多。

0

你只需要做到這一點獲得位置:

int indexOf (object s, Hashtable h) 
{ 
    foreach (DictionaryEntry e in h) 
     if (e.Value.Equals(s)) 
      return (int)e.Key; 
    return -1; 
} 

,並調用它像這樣:

var posi = indexOf("ABC", yourHashTable); 

,但它是真實的,使用Dictionary會容易得多。

0

如果你真的要使用的HashTable代替Dictionary你可以做到以下幾點:

var posi = from a in c.Cast<int>() 
      where h[a] == "ABC" 
      select a;