I'm only using this code for an example. Assume I have the following Person class.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace dictionaryDisplay
{
class Person
{
public string FirstName { get; private set;}
public string LastName { get; private set; }
public Person(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
public override string ToString()
{
return this.FirstName + " " + this.LastName;
}
}
}
Main Program
static void Main(string[] args)
{
ConcurrentDictionary<int, Person> personColl = new ConcurrentDictionary<int, Person>();
personColl.TryAdd(0, new Person("Dave","Howells"));
personColl.TryAdd(1, new Person("Jastinder","Toor"));
Person outPerson = null;
personColl.TryRemove(0, out outPerson);
//Is this safe to do?
foreach (var display in personColl)
{
Console.WriteLine(display.Value);
}
}
is this the safe way of iterating over a concurrent dictionary? If not, what is the safe way for doing it?
Lets say that I want to remove a Person object from the dictionary. I use the tryRemove method, but what do I do with the outPerson object? the removed Person from the dictionary is stored in it. What do I do with the outPerson object to clear it completely?
Yes, it's safe in that it won't throw an exception. If elements are added or removed after you start iterating, they may or may not be included in the iteration. From the
GetEnumerator
documentation:Next:
Whatever you want with it, including nothing. You could just cast the dictionary to
IDictionary<TKey, TValue>
and callRemove
, or just useTryRemove
and ignore the variable afterwards:There's no concept of "clearing [the object] completely" - if you haven't got any references to it, it will be garbage collected. But either way, it's not in the dictionary any more (at least via that key). If you don't use the variable (
ignored
above) anywhere else in the code, it won't stop the object from being garbage collected.Take a look at this article.
Since TryRemove will remove the item from collection, you might need the value of the key.
It is safe to iterate it with foreach. You wont get an exception.