Ok, dans votre exemple, vous êtes effectivement juste de trouver l'entrée de l'objet Customer
avec Id
= 1 et mettre à jour la valeur associée. En pratique, je pense que votre code sera probablement en mesure d'obtenir une référence à votre objet Customer
avant de mettre à jour la valeur associée dans le dictionnaire. Si tel est le cas, alors il n'y a pas besoin d'une boucle. Voici un exemple très simple où une boucle n'est pas nécessaire parce que votre code contient déjà une référence à la variable customer1
. Bien que mon exemple soit trop simplifié, le concept est que vous pourriez potentiellement obtenir une référence à l'objet Customer
souhaité par d'autres moyens que l'itération sur le dictionnaire.
static void Main(string[] args)
{
Dictionary<Customer, int> CustomerOrderDictionary = new Dictionary<Customer, int>();
Customer customer1 = new Customer { Id = 1, FullName = "Jo Bloogs" };
Customer customer2 = new Customer { Id = 2, FullName = "Rob Smith" };
CustomerOrderDictionary.Add(customer1, 3);
CustomerOrderDictionary.Add(customer2, 5);
// you already have a reference to customer1, so just use the accessor on the dictionary to update the value
CustomerOrderDictionary[customer1]++;
}
Si vous devez effectuer une sorte de mise à jour sur plusieurs Customer
objets en fonction d'autres critères, alors vous pourriez avoir besoin d'une boucle. L'exemple suivant suppose que vous disposerez d'une collection autre que le dictionnaire qui stocke vos objets Customer
et que vous pouvez utiliser cette collection d'objets Customer
pour identifier ceux dont la valeur associée dans le dictionnaire doit être mise à jour.
static void Main(string[] args)
{
// presumably you will have a separate collection of all your Customer objects somewhere
List<Customer> customers = new List<Customer>();
Customer customer1 = new Customer { Id = 1, FullName = "Jo Bloogs" };
Customer customer2 = new Customer { Id = 2, FullName = "Rob Smith" };
Customer customer3 = new Customer { Id = 3, FullName = "Rob Zombie" };
customers.Add(customer1);
customers.Add(customer2);
customers.Add(customer3);
Dictionary<Customer, int> CustomerOrderDictionary = new Dictionary<Customer, int>();
CustomerOrderDictionary.Add(customer1, 3);
CustomerOrderDictionary.Add(customer2, 5);
// let's just say that we're going to update the value for any customers whose name starts with "Rob"
// use the separate list of Customer objects for the iteration,
// because you would not be allowed to modify the dictionary if you iterate over the dictionary directly
foreach (var customer in customers.Where(c => c.FullName.StartsWith("Rob")))
{
// the dictionary may or may not contain an entry for every Customer in the list, so use TryGetValue
int value;
if (CustomerOrderDictionary.TryGetValue(customer, out value))
// if an entry is found for this customer, then increment the value of that entry by 1
CustomerOrderDictionary[customer] = value + 1;
else
// if there is no entry in the dictionary for this Customer, let's add one just for the heck of it
CustomerOrderDictionary.Add(customer, 1);
}
}
Si ce n'est pas le cas et la seule source de Customer
objets dont vous disposez est le dictionnaire lui-même, alors vous aurez besoin d'effectuer une sorte de clonage/copie de ces objets à une liste séparée/array avant d'itérer sur le dictionnaire pour une modification. Voir la réponse de Jon Skeet pour cette affaire; il suggère d'utiliser un filtre Where
sur la propriété Keys
du dictionnaire et utilise la méthode ToList
pour créer une instance distincte List<Customer>
à des fins d'itération.
Salut, Merci beaucoup qui a travaillé.J'essaierai de voir si cela fonctionne avec le vrai code.thanks – user9969