You can use AddOrUpdate.
Conceptually, the AddOrUpdate method will always result in a value change in the collection.
The point of these methods is to resolve problems with the nature of time in concurrent systems. With multiple threads, you cannot predict what elements will be found in the collection at any point of execution.
Here is MSDN Example
class CD_GetOrAddOrUpdate { // Demonstrates: // ConcurrentDictionary<TKey, TValue>.AddOrUpdate() // ConcurrentDictionary<TKey, TValue>.GetOrAdd() // ConcurrentDictionary<TKey, TValue>[] static void Main() { // Construct a ConcurrentDictionary ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(); // Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates Parallel.For(0, 10000, i => { // Initial call will set cd[1] = 1. // Ensuing calls will set cd[1] = cd[1] + 1 cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1); }); Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd[1]); // Should return 100, as key 2 is not yet in the dictionary int value = cd.GetOrAdd(2, (key) => 100); Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value); // Should return 100, as key 2 is already set to that value value = cd.GetOrAdd(2, 10000); Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value); } }
var dictArtifactList = termDictionary[<Key>];as a list. you need a way to compare your current artifact with those in your list. My preference would be to use a LINQ query and do adictArtifactList.FirstOrDefault(<LAMBDA Comparer>);then update that Artifact in your list.