This method uses the default comparer returned by EqualityComparer<T>.Default, which uses an ordinal comparison for strings. If you passed a specified comparer when you constructed the dictionary, ContainsValue could return different results than from ContainsKey.
For example, the following code shows this behavior:
[C#]
using System;
using System.Collections.Generic;
namespace Samples
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>(StringComparer.CurrentCulture);
dictionary.Add("Encyclopædia", "Encyclopædia");
Console.WriteLine(dictionary.ContainsKey("Encyclopaedia"));
Console.WriteLine(dictionary.ContainsValue("Encyclopaedia"));
}
}
}
The above outputs the following:
True
False
As you can see, ContainsKey and ContainsValue are returning different results for the same search string. This is because ContainsKey is using a culture-sensitive comparison, whereas, ContainsValue is using an ordinal comparison.
As a workaround to get consistent results, you could define an extension method on IDictionary<TKey, TValue> that allows you to specify a comparer:
[C#]
using System;
using System.Collections.Generic;
namespace Samples
{
public static class DictionaryExtensions
{
public static bool ContainsValue<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TValue value, IEqualityComparer<TValue> comparer)
{
if (comparer == null)
comparer = EqualityComparer<TValue>.Default;
foreach (var pair in dictionary)
{
if (comparer.Equals(pair.Value, value))
return true;
}
return false;
}
}
}
The above extension method, then allows you to do the following:
[C#]
using System;
using System.Collections.Generic;
namespace Samples
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>(StringComparer.CurrentCulture);
dictionary.Add("Encyclopædia", "Encyclopædia");
Console.WriteLine(dictionary.ContainsKey("Encyclopaedia"));
Console.WriteLine(dictionary.ContainsValue("Encyclopaedia", StringComparer.CurrentCulture));
}
}
}
The above outputs the following:
True
True