Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Find Item in Dictionary Collection?

I have declared and populated the following collection.

protected static Dictionary<string, string> _tags; 

Now I want to look locate a particular entry in the collection. I tried the following.

thisTag = _tags.FirstOrDefault(t => t.Key == tag); if (thisTag != default(KeyValuePair<string, string>))     ... 

And I get the error:

Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair' and ''

Initially I attempted to compare the result to null, and I guess that's not supported with structs.

I would've thought that finding an item within a collection is a very trivial task. So how the heck to I determine if the item I'm looking for was found?

(Note: I'm using Dictionary because I want fast lookups. I know I can use Contains() to determine if the item is there. But that means a total of two lookups, which sort of defeats the purpose of having a fast lookup. I'll happily using a different collection if it can quickly lookup an item and I have a way to determine if it was successful.)

like image 307
Jonathan Wood Avatar asked Apr 03 '11 16:04

Jonathan Wood


People also ask

What is the collection of dictionary C#?

In C#, Dictionary is a generic collection which is generally used to store key/value pairs. The working of Dictionary is quite similar to the non-generic hashtable. The advantage of Dictionary is, it is generic type. Dictionary is defined under System.

What is dictionary collection?

noun. the act of collecting. something that is collected; a group of objects or an amount of material accumulated in one location, especially for some purpose or as a result of some process: a stamp collection;a collection of unclaimed hats in the checkroom;a collection of books on Churchill.

How do you check if a key already exists in a dictionary C#?

Syntax: public bool ContainsKey (TKey key); Here, the key is the Key which is to be located in the Dictionary. Return Value: This method will return true if the Dictionary contains an element with the specified key otherwise, it returns false.

Can we use index in dictionary C#?

Performance Considerations While Using Index So using The Dictionary<TKey,TValue> as an array has a performance penalty. The Dictionary<TKey,TValue> has no way to access directly the nth “element” via ElementAt. If we want to access the nth “element”, the Dictionary needs to enumerate all of the entries in it.


1 Answers

thisTag = _tags.FirstOrDefault(t => t.Key == tag); 

is an inefficient and a little bit strange way to find something by key in a dictionary. Looking things up for a Key is the basic function of a Dictionary.

The basic solution would be:

if (_tags.Containskey(tag)) { string myValue = _tags[tag]; ... } 

But that requires 2 lookups.

TryGetValue(key, out value) is more concise and efficient, it only does 1 lookup. And that answers the last part of your question, the best way to do a lookup is:

string myValue; if (_tags.TryGetValue(tag, out myValue)) { /* use myValue */ } 

VS 2017 update, for C# 7 and beyond we can declare the result variable inline:

if (_tags.TryGetValue(tag, out string myValue)) {     // use myValue; } // use myValue, still in scope, null if not found 
like image 176
Henk Holterman Avatar answered Sep 21 '22 08:09

Henk Holterman