Most elegant way to convert string array into a dictionary of strings

Viewed 82085

Is there a built-in function for converting a string array into a dictionary of strings or do you need to do a loop here?

9 Answers

I'll assume that the question has to do with arrays where the keys and values alternate. I ran into this problem when trying to convert redis protocol to a dictionary.

private Dictionary<T, T> ListToDictionary<T>(IEnumerable<T> a)
{
    var keys = a.Where((s, i) => i % 2 == 0);
    var values = a.Where((s, i) => i % 2 == 1);
    return keys
        .Zip(values, (k, v) => new KeyValuePair<T, T>(k, v))
        .ToDictionary(kv => kv.Key, kv => kv.Value);
}

The Question is not very clear, but Yes you can convert a string to Dictionary provided the string is delimited with some characters to support Dictionary<Key,Value> pair

So if a string is like a=first;b=second;c=third;d=fourth you can split it first based on ; then on = to create a Dictionary<string,string> the below extension method does the same

public static Dictionary<string, string> ToDictionary(this string stringData, char propertyDelimiter = ';', char keyValueDelimiter = '=')
{
    Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
    Array.ForEach<string>(stringData.Split(propertyDelimiter), s =>
        {
            if(s != null && s.Length != 0)
                keyValuePairs.Add(s.Split(keyValueDelimiter)[0], s.Split(keyValueDelimiter)[1]);
        });

    return keyValuePairs;
}

and can use it like

var myDictionary = "a=first;b=second;c=third;d=fourth".ToDictionary();

since the default parameter is ; & = for the extension method.

You can create a dictionary from an IEnumerable<T>, including an array, via:

var dictionary = myEnumerable.ToDictionary(element => element.Key,
                                           element => element.Value)

where Key and Value are the key and value you want to store in each dictionary element. Available in .NET Framework 3.5+/.NET Core 1.0+/.NET 5.0+. Official documentation.

If you want the dictionary values to be the elements from the original enumerable:

   var dictionary = myEnumerable.ToDictionary(element => element.Key)

If you only need high-performance set operations, you may be able to use:

var words = new HashSet<string>(listOfStrings);

In simple terms, the HashSet class can be thought of as a Dictionary<TKey,TValue> collection without values. Official documentation.

(Note that a 'sequence' in an entirely unrelated object. Originally submitted an existing answer edit but it was rejected by the author so posting separately, including with links to the official Microsoft documentation.)

Related