2

I am trying to use hash table in linq to fetch the key whose value is ABC. What I have done so far:

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

Expected output: 1, 3 (keys having value "ABC")

ICollection c= h.Keys;

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

But the above query is not working and giving compile time error.

The error is:

could not find an implementation of the query pattern for source type 'System.Collections.ICollection'.

What I am doing wrong? I am new to C#. How to use Hashtable in LINQ?

Stephan Bauer
  • 9,120
  • 5
  • 36
  • 58
user2623213
  • 233
  • 2
  • 4
  • 10
  • I would recommend using a `Dictionary`. [More info on `Hashtable` vs `Dictionary` here.](http://stackoverflow.com/questions/301371/why-is-dictionary-preferred-over-hashtable) – Loetn May 12 '14 at 06:37

4 Answers4

4

You should not use non-generic HashTable to start with. Use generic Dictionary<int, string> instead:

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;
MarcinJuraszek
  • 124,003
  • 15
  • 196
  • 263
2

Use a Dictionary<int, string> instead of a Hashtable (see here for why) then do the following:

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);

But If you want Hastable, Then please take a look this link

link 1

link 2

But My opinion is, Please use Dictionary .

Because Dictionary is a generic collections, And It's are a lot faster as there's no boxing/unboxing.

Community
  • 1
  • 1
2

If you really want to use that HashTable instead of the Dictionary you can do the following:

var posi = from a in c.Cast<int>()
           where h[a] == "ABC"
           select a;
Stormenet
  • 25,926
  • 9
  • 53
  • 65
0

You just need to do this to get position:

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

and call it like this:

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

but it is true that using Dictionary would be much easier.

Tolga Evcimen
  • 7,112
  • 11
  • 58
  • 91