views:

116

answers:

1

I guess another way to phrase this would be "Is there a class like List<> in C#, but optimized for checking whether a particular value is present?" I'm sure for a small set of values List<>.Contains would probably be fine, but what if I have a set of thousands or millions of values and wanted to find out whether a certain value was in it?

I've implemented this kind of thing in the past by creating a Dictionary<object, int> and setting the value to 0 for every key, but this feels really clunky. And now there's Stack Overflow, where my stupid question can be transformed into education for thousands (dozens, even). So here it is!

I'm not even sure what such a class would be called, other than maybe Set, so obviously searches on the topic have been... challenging :)

+17  A: 

Try using the HashSet<T> class.

Edit: I spent a long long time doing exactly what you did until I just stumbled on this class while reading a blog.

Jake
+1, admittedly I did the same thing.. :)
Ryan Emerle
Also, in .NET 4, this class now implements the new `ISet<T>` interface, along with its also-new cousin `SortedSet<T>`, which is the same, but with order semantics.
Martinho Fernandes
Back in the dark days of .NET 1.0 and 2.0 we just made a class that essentially worked like HashSet but used a dictionary of <TKey, byte> underneath.
John JJ Curtis
@Jeff same here, though we used <T,bool>
Ryan Emerle
@Jeff: you just made me feel nostalgic. I'm not sure that's a good thing.
Martinho Fernandes
In the .NET 2.0 days I just used the PowerCollections library which already had a `Set<T>`, `Bag<T>`, and ordered variants... pretty much everything that MS finally got around to including in .NET 4. I thought everybody knew about it. :P
Aaronaught
The `Iesi.Collections` library ships with NHibernate. It includes implementations of `ISet<T>` etc.
Justice