关于词典

时间:2014-03-03 19:55:54

标签: c# dictionary

我可以确保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);
}

4 个答案:

答案 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;
}