我可以确保C#中的字典中只有一个特定值吗?
例如,如果我定义一个字典,哪个键是char而value是char,我可以确保如果字符'a'已经是现有值,字典中将不会有另一个值'a' ?
我有一个解决方案,但我想知道是否有更好的解决方案:
static void Main()
{
Dictionary<int, int> dic = new Dictionary<int, int>();
bool valExists = false;
Console.WriteLine("please enter key and value");
int key = int.Parse(Console.ReadLine());
int val = int.Parse(Console.ReadLine());
foreach (KeyValuePair<int,int> keyval in dic)
{
if (keyval.Value == val)
{
valExists = true;
break;
}
}
if (!valExists)
dic.Add(key, val);
}
答案 0 :(得分:5)
我可以确保在C#中的字典中只有一个特定值吗?
不是这样(它不会遵循正常的字典合同),但听起来你有效地想要一个双向字典。你可以通过编写两个词典来实现,每个词典都朝向每个方向。我有answer on another question的示例代码。
这将允许您直接从“值”转到“关键” - 如果您不需要,您可以随时保持HashSet<TValue>
和正常TDictionary<TKey, TValue>
并投掷如果调用者尝试添加已存在的值,则为异常。
同样,我建议您不要通过Dictionary<,>
派生来做 - 而只是撰写 Dictionary<,>
和HashSet<>
。 (我甚至不会实现IDictionary<,>
,因为您有其他常规字典不包含的约束。)
答案 1 :(得分:2)
为了避免需要对每个Add
的整个字典进行线性搜索,您可以保留HashSet<TValue>
以及字典。添加新值时,可以先检查该集。如果它在那里,它就在字典中。如果您最终添加该项目,请将其添加到该集合中。从字典中删除项目时,您还需要将其从集合中删除。
答案 2 :(得分:2)
字典类中有一个内置方法来检查值是否存在。请注意,这是一个线性搜索,因此它不是最有效的方法,但确实存在......
static void Main()
{
Dictionary<int, int> dic = new Dictionary<int, int>();
Console.WriteLine("please enter key and value");
int key = int.Parse(Console.ReadLine());
int val = int.Parse(Console.ReadLine());
if (!dic.ContainsValue(val))
dic.Add(key, val);
}
答案 3 :(得分:0)
这会告诉您是否有重复值:
dic.Values.Distinct().Count() == dic.Values.Count() // true if no duplicates found
为防止重复:
if (!dic.ContainsValue(val)) {
dic[key] = val;
}
为了获得更好的性能,请使用seaparate HashSet。
var values = new HashSet<int>();
if (!values.Contains(val)) {
values.Add(val);
dic[key] = val;
}