Search code examples
c#linqdictionary

Convert an array to dictionary with value as index of the item and key as the item itself


I have an array such as -

arr[0] = "Name";
arr[1] = "Address";
arr[2] = "Phone";
...

I want to create a Dictionary<string, int> such that the array values will be the dictionary keys and the dictionary values will be the index, so that I can get the index of a column by querying its name in O(1). I know this should be fairly simple, but I can't get my head around it.

I tried -

Dictionary<string, int> myDict = arr.ToDictionary(x => x, x => indexOf(x))

however, this returns -

{(Name, 0), (Address, 0), (Phone, 0),...}

I know this happens because it is storing the index of the first occurence, but that's not what I'm looking to do.


Solution

  • You can use the overload of Select which includes the index:

    var dictionary = array.Select((value, index) => new { value, index })
                          .ToDictionary(pair => pair.value, pair => pair.index);
    

    Or use Enumerable.Range:

    var dictionary = Enumerable.Range(0, array.Length).ToDictionary(x => array[x]);
    

    Note that ToDictionary will throw an exception if you try to provide two equal keys. You should think carefully about the possibility of your array having two equal values in it, and what you want to happen in that situation.

    I'd be tempted just to do it manually though:

    var dictionary = new Dictionary<string, int>();
    for (int i = 0; i < array.Length; i++)
    {
        dictionary[array[i]] = i;
    }