C# 有没有办法验证字典的值

C# 有没有办法验证字典的值,c#,validation,dictionary,.net-3.5,C#,Validation,Dictionary,.net 3.5,可能重复: 我希望确保字典具有唯一的键和值。除了构建我自己的类之外,还有什么方法可以添加这种验证吗?这是我能想到的在字典中完成值验证的唯一方法。但是,也许有一些属性我可以补充,我似乎无法通过谷歌找到 如果有帮助的话,我希望将此字典与WPF绑定一起使用。字典键根据定义是唯一的。确保字典值唯一的方法与检查每个数组或集合成员是否唯一的方法相同 .NET3.5引入了HashSet,假设您的TValue类型实现了Equals(TValue),它可以加快速度 HashSet seenValues=newh

可能重复:

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


如果有帮助的话,我希望将此字典与WPF绑定一起使用。

字典键根据定义是唯一的。确保字典值唯一的方法与检查每个数组或集合成员是否唯一的方法相同

.NET3.5引入了
HashSet
,假设您的TValue类型实现了
Equals(TValue)
,它可以加快速度

HashSet seenValues=newhashset();
foreach(myDictionary中的TKey){
if(seenValues.Contains(myDictionary[key])抛出新异常(“Dictionary包含重复项”);
请参阅value.Add(myDictionary[key]);
}

您可以尝试使用此双向字典类:

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; }
}
公共类映射
{
专用词典_forward=新词典();
私有字典_reverse=新字典();
公共地图()
{
this.Forward=新索引器(_Forward);
this.Reverse=新索引器(_Reverse);
}
公共类索引器
{
私人词典;
公共索引器(字典)
{
_字典=字典;
}
公共T4本[T3指数]
{
获取{return _dictionary[index];}
设置{u字典[index]=value;}
}
}
公共空间添加(T1、T2)
{
_加上(t1,t2);
_相反。添加(t2,t1);
}
公共索引器转发{get;private set;}
公共索引器反向{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
var-map=newmap();
添加(42,“你好”);
控制台写入线(地图转发[42]);
//输出“你好”
Console.WriteLine(地图反转[“Hello”]);
//产出42

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

不要认为有任何属性可以这样做。这取决于字典的实现。最好的办法是用您自己的类包装它(即使您不想这样做),或者编写一个Linq查询或实用方法来检查现有的字典。创建两个字典
new dictionary()
new dictionary()
您的意思是一个唯一键的唯一值。??数据是否假定为常量,或者,如果字典中的一个值发生变化,那么它将等于另一个值。只需在字典不知道的情况下更改值的实例。。。(我想知道普通字典如何处理关键对象变得相等时的类似效果。)@L.B这不符合我的目的(我已经更新,我将在WPF数据绑定中使用它),或者只是
foreach(myDictionary.Values中的TValue值)
。是的,你是对的。起初,我认为
.Values
属性不能保证以与
.Keys
属性相同的顺序返回值(例如自动删除重复值),但MSDN文档说确实如此。按照规定,我正在寻找一些不需要编写自己的类的东西…开箱即用…我想没有什么东西,但是你不需要用我给出的示例编写一个新类。
var map = new Map<int, string>();

map.Add(42, "Hello");

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

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