web-dev-qa-db-fra.com

La façon la plus élégante de convertir un tableau de chaînes en un dictionnaire de chaînes

Existe-t-il une fonction intégrée pour convertir un tableau de chaînes en un dictionnaire de chaînes ou avez-vous besoin de faire une boucle ici?

40
leora

En supposant que vous utilisez .NET 3.5, vous pouvez activer n'importe quelle séquence (c'est-à-dire IEnumerable<T>) dans un dictionnaire:

var dictionary = sequence.ToDictionary(item => item.Key,
                                       item => item.Value)

Key et Value sont les propriétés appropriées que vous souhaitez utiliser comme clé et valeur. Vous pouvez spécifier une seule projection qui est utilisée pour la clé, si l'élément lui-même est la valeur souhaitée.

Ainsi, par exemple, si vous souhaitez mapper la version majuscule de chaque chaîne à l'original, vous pouvez utiliser:

var dictionary = strings.ToDictionary(x => x.ToUpper());

Dans votre cas, que voulez-vous que les clés et les valeurs soient?

Si vous voulez juste un set (que vous pouvez vérifier pour voir s'il contient une chaîne particulière, par exemple), vous pouvez utiliser:

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

Vous pouvez utiliser LINQ pour ce faire, mais la question posée par Andrew doit être répondue en premier (quelles sont vos clés et valeurs):

using System.Linq;

string[] myArray = new[] { "A", "B", "C" };
myArray.ToDictionary(key => key, value => value);

Le résultat est un dictionnaire comme celui-ci:

A -> A
B -> B
C -> C
14
Ronald Wildenberg

IMO, Quand nous disons un Array nous parlons d'une liste de valeurs que nous pouvons obtenir une valeur en appelant son index (valeur => tableau [index]), donc un dictionnaire correct est un dictionnaire avec une clé d'index.

Et grâce à @John Skeet, la bonne façon d'y parvenir est:

var dictionary = array
    .Select((v, i) => new {Key = i, Value = v})
    .ToDictionary(o => o.Key, o => o.Value);

Une autre façon consiste à utiliser une méthode d'extension comme celle-ci:

public static Dictionary<int, T> ToDictionary<T>(this IEnumerable<T> array)
{
    return array
        .Select((v, i) => new {Key = i, Value = v})
        .ToDictionary(o => o.Key, o => o.Value);
}
6
shA.t

Si vous avez besoin d'un dictionnaire sans valeurs, vous pourriez avoir besoin d'un HashSet :

var hashset = new HashSet<string>(stringsArray);
5
Kobi

Que voulez-vous dire?

Un dictionnaire est un hachage, où les clés correspondent aux valeurs.

Quelles sont vos clés et quelles sont vos valeurs?

foreach(var entry in myStringArray)
    myDictionary.Add(????, entry);
3
Andrew Bullock

La question n'est pas très claire, mais oui, vous pouvez convertir une chaîne en Dictionary à condition que la chaîne soit délimitée avec quelques caractères pour prendre en charge Dictionary<Key,Value> paire

Donc, si une chaîne est comme a=first;b=second;c=third;d=fourth vous pouvez d'abord le diviser en fonction de ; puis sur = créer un Dictionary<string,string> la méthode d'extension ci-dessous fait de même

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 =>
        {
            keyValuePairs.Add(s.Split(keyValueDelimiter)[0], s.Split(keyValueDelimiter)[1]);
        });

    return keyValuePairs;
}

et peut l'utiliser comme

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

puisque le paramètre par défaut est ; & = pour la méthode d'extension.

0
Vinod Srivastav
            Dictionary<int, string> dictionaryTest = new Dictionary<int, string>();

            for (int i = 0; i < testArray.Length; i++)
            {
                dictionaryTest.Add(i, testArray[i]);
            }

            foreach (KeyValuePair<int, string> item in dictionaryTest)
            {


                Console.WriteLine("Array Position {0} and Position Value {1}",item.Key,item.Value.ToString()); 
            }
0
Dwizzle