J'ai créé un dictionnaire imbriqué avec les éléments suivants:

Dictionary<DateTime, Dictionary<string, string>> dateDict =
    new Dictionary<DateTime, Dictionary<string, string>>();

J'entre ensuite des valeurs dans ce dictionnaire en utilisant ce qui suit:

while (reader.Read())
{
    DateTime date = DateTime.Parse(reader["Event_Date"].ToString());
    string name = reader["Event_Name"].ToString();
    string guid = reader["Event_GUID"].ToString();
    dateDict.Add(date, new Dictionary<string, string>());
    dateDict[date].Add(name, guid);
}

Ma question est de savoir comment extraire correctement les variables du dictionnaire imbriqué?

J'ai cette boucle en cours d'exécution pour extraire les valeurs et les attribuer à DateTimePicker et aux champs de texte:

for (int i = 0; i < dateDict.Count; i++)
{
    DateTime keyVar = dateDict.ElementAt(i).Key;
    eventDateBoxes[i].Value = keyVar;
    eventTextBoxes[i].Text = dateDict[keyVar[]];
}

La partie eventTextBoxes est l'endroit où je me demande comment extraire la valeur du dictionnaire imbriqué, d'où la raison pour laquelle cette partie du code est incorrecte / incomplète.

Je ne peux pas utiliser de tuples car j'utilise .NET inférieur à 4 et je n'arrive pas à me concentrer sur la création d'une classe personnalisée pour qu'elle agisse comme son propre tuple ou multidictionary.

0
Ben R 23 mai 2018 à 18:24

3 réponses

Meilleure réponse

Il semble que vous n'ayez pas besoin d'un Dictionary<DateTime, Dictionary<string, string>> puisque vous n'avez qu'un seul élément dans votre dictionnaire interne, vous avez besoin d'un Dictionary<DateTime, Dictionary<string, Event>>Event est une classe qui contient vos données d'événement. Quelque chose comme:

public class Event
{
    public string Name {get; set;}
    public string Guid {get; set;}  // you could actually use the GUID type here!
}

Ensuite, vous le peuplerez comme:

while (reader.Read())
{
    DateTime date = DateTime.Parse(reader["Event_Date"].ToString());
    string name = reader["Event_Name"].ToString();
    string guid = reader["Event_GUID"].ToString();
    dateDict.Add(date, new Event() { Name = name, Guid = guid };
}

Ensuite, lorsque vous obtenez un élément de votre dictionnaire par clé:

var item = dateDict[someKey];

Vous pouvez récupérer votre nom et votre guide:

var name = item.Name;
var guid = item.guid;

De plus, étant donné que vous parcourez votre dictionnaire par index numérique plutôt que par clé, il semble probable que vous n'ayez probablement pas du tout besoin d'un dictionnaire. Peut-être que tout ce que vous avez à faire est d'ajouter une propriété Date à votre Event et d'avoir juste un List<Event>.

1
Matt Burland 23 mai 2018 à 15:43

J'utiliserais une requête foreach ou LINQ. Mais ce que vous voulez en tant que DateTimePicker.Text n'est pas clair:

List<DateTimePicker> eventDateBoxes = dateDict
    .Select(kv => new{ 
       Date = kv.Key, 
       EventName = kv.Value["Event_Name"],
       EventGuid = kv.Value["Event_GUID"],
    })
    .Select(x => new DateTimePicker{ Value = x.Date, Text = x.EventName })
    .ToList();
1
Tim Schmelter 23 mai 2018 à 15:39

Voici les grandes lignes de ce que vous feriez:

foreach (var element in dateDict)
{
    eventDateBoxes[i].Value = element.Key;
    foreach (var subElement in element.Value)
    {
        eventTextBoxes[i].Text = subElement.Value;
    }
}

Comme d'autres le soulignent dans le commentaire, il ne peut y avoir de relation un-à-un entre les éléments du dictionnaire externe et les zones de texte car il peut (potentiellement) y avoir plusieurs entrées dans le sous-élément.

1
johnny 5 23 mai 2018 à 15:43