繁体   English   中英

C#字典访问

[英]c# Dictionary Access

因此,我有一个字典,我想通过“字符串”键获取对象。 当我这样做时它起作用:

 foreach (KeyValuePair<string, Object> entry in myDictionary)
        {            
            if(entry.Key == myStringKey){
                Object myObject = entry.Value;
            }
        }

...但是如果我尝试以这种方式抛出KeyNotFoundException:

Object myObject = myDictionary[myStringKey];

该数组肯定包含密钥。 有谁知道为什么我不能这样做呢?

编辑:该类看起来像这样:

public class myClass {

    Dictionary<string, Object> myDictionary = new Dictionary<string, Object>();

    public myClass() {
        // Messenger recieves a string-Variable (msg)
        Messenger.Default.Register<string>(this, "onObjectClicked", msg =>
        {
            doSomethingWithObject(msg);
        });
    }

    public void doSomethingWithObject(string identifier){
       Object myObject = myDictionary[identifier];
        //DO SOMENTING WITH THIS OBJECT...
    }
}

编辑:

老实说,一件事为什么起作用而另一件事中止了程序

唯一的解释

Object myObject = myDictionary[myStringKey];

导致找不到密钥的错误是词典不包含您的密钥。

您的其他代码以及for每个循环可能可以正常运行,但不会为myObject分配值。

我不知道您使用的Messenger对象。 因此,我认为这可能是套管问题。

请尝试以下代码:它创建一个字典,其中的键索引器不区分大小写,并告诉我们正在发生什么。

Dictionary<string, Object> myDictionary = 
    new Dictionary<string, Object>(StringComparer.OrdinalIgnoreCase);

编辑

“ ==”可能会导致某些语言环境出现问题。 看这个问题这篇文章

编辑2

反编译了.NET 4.0的Dictionary indexer和TryGetValue:

public TValue this[TKey key]
{
    get
    {
        int num = this.FindEntry(key);
        if (num >= 0)
        {
            return this.entries[num].value;
        }
        [...]
    }

public bool TryGetValue(TKey key, out TValue value)
{
    int num = this.FindEntry(key);
    if (num >= 0)
    {
        ...
    }

两者都使用FindEntry(不使用通常的“ ==”比较)。

您所描述的问题不可能是。 请在你的代码既有方法一起 ,仔细检查有一定的跟踪结果。

如果要将值添加到类中的字典,则没有理由获取异常。 作为一种好习惯,在访问值之前,应始终检查密钥是否存在。 试试以下代码片段:

if(myDictionary.ContainsKey(myStringKey))
    return myDictionary[myStringKey];

//else return something else or throw exception

或按照Sriram Sakthivel的建议使用:

Object obj;

if(myDictionary.TryGetValue(myStringKey, out obj))
    return obj;

//key was not present in dictionary, take some other measure

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM