2012-09-05 41 views
1

可能重复:
C# dictionary type with unique keys and values有没有办法来验证字典的值

我想,以确保字典具有独特的键和值。除了构建我自己的类之外,有什么方法可以添加这种验证吗?这是我可以考虑完成字典中值的验证的唯一方法。但是,也许有一些属性,我可以补充说,我似乎无法通过谷歌找到。

我正在寻找与WPF绑定一起使用这本词典,如果有帮助的话。

+0

不要认为有任何属性会做这样的事情。这取决于字典的实施。最好的办法是用自己的类包装它(即使你不想这样做),或者编写一个Linq查询或实用程序方法来检查现有字典。 –

+5

创建两个字典'新字典()'和'新字典()' –

+0

您的意思是唯一键的唯一值。 – perilbrain

回答

3

按照定义,字典密钥是唯一的。确保字典值是唯一的,就像检查每个数组或集合成员是唯一的一样。

.NET 3.5引入了HashSet<T>,它加快了速度,假设你的TValue类型实现了Equals(TValue)

HashSet<TValue> seenValues = new HashSet<TValue>(); 
foreach(TKey key in myDictionary) { 
    if(seenValues .Contains(myDictionary[key])) throw new Exception("Dictionary contains duplicate item."); 
    seenValues .Add(myDictionary[key]); 
} 
+0

或者只是'foreach(myDictionary.Values中的TValue值)'。 – erikH

+0

是的,你是对的。最初我以为'.Values'属性不能保证以'.Keys'属性相同的顺序返回值(例如自动删除重复值),但是MSDN文档说它确实如此,所以是的。 – Dai

+0

按照说明,我正在寻找一些不需要编写我自己的课程的东西......开箱即用......猜测没有任何东西 –

0

你可以尝试使用这种双向字典类:

public class Map<T1, T2> 
{ 
    private Dictionary<T1, T2> _forward = new Dictionary<T1, T2>(); 
    private Dictionary<T2, T1> _reverse = new Dictionary<T2, T1>(); 

    public Map() 
    { 
     this.Forward = new Indexer<T1, T2>(_forward); 
     this.Reverse = new Indexer<T2, T1>(_reverse); 
    } 

    public class Indexer<T3, T4> 
    { 
     private Dictionary<T3, T4> _dictionary; 
     public Indexer(Dictionary<T3, T4> dictionary) 
     { 
      _dictionary = dictionary; 
     } 
     public T4 this[T3 index] 
     { 
      get { return _dictionary[index]; } 
      set { _dictionary[index] = value; } 
     } 
    } 

    public void Add(T1 t1, T2 t2) 
    { 
     _forward.Add(t1, t2); 
     _reverse.Add(t2, t1); 
    } 

    public Indexer<T1, T2> Forward { get; private set; } 
    public Indexer<T2, T1> Reverse { get; private set; } 
} 

您可以使用它像这样:

var map = new Map<int, string>(); 

map.Add(42, "Hello"); 

Console.WriteLine(map.Forward[42]); 
// Outputs "Hello" 

Console.WriteLine(map.Reverse["Hello"]); 
//Outputs 42 

这是一个相当简单的实现。你可能需要公开一些潜在的字典功能,但至少这是一个开始。

相关问题