System.Collections.Generic.Dictionary和KeyNotFoundException

时间:2014-02-27 17:51:59

标签: c# asp.net-mvc-3 generics dictionary

我们的ASP.NET MVC 3使用一个模型,该模型通过名为Fields的属性公开System.Collections.Generic.Dictionary,我们使用字符串作为键。

我们注意到抛出了一个KeyNotFoundException - 但是对于我们知道的字符串键就在那里!

这个循环,当我们在字典中有3个项目时:

var ee = Model.Fields.GetEnumerator();
while (ee.MoveNext())
{
    logger.ErrorFormat("STRANGE ERROR: '{0}'", ee.Current.Key); 
    logger.ErrorFormat("STRANGE ERROR: {0}", ee.Current.Key.GetHashCode());          
}

产地:

STRANGE ERROR: 'title'
STRANGE ERROR: -1859741728
STRANGE ERROR: 'link'
STRANGE ERROR: 325350890
STRANGE ERROR: 'view'
STRANGE ERROR: 1582259101

然而,以下是错误的:

Model.Fields.ContainsKey("title") // Is False (incorrectly)

我想知道哈希码是否不同,所以尝试了:

string t = "title";
logger.ErrorFormat("STRANGE ERROR: {0}", t.GetHashCode());

产生:

-1859741728

所以我知道Dictionary包含我的项目和字符串键哈希到相同的代码,为什么我不能访问Dictionary项目?

更新

继承视图代码以提供一些上下文。这段代码粗糙(!)是一些非常快速诊断的产物!

@using System.Xml.Serialization;
@using System.Text;
@using log4net;

@model IComponent

@{           
    string title = String.Empty;

    var logger = log4net.LogManager.GetLogger(typeof(ContentModel.Component));
    logger.Error("STRANGE ERROR: CHECK TITLE");

    // Key in dictionary?
    if (Model.Fields.ContainsKey("title"))
    {
        logger.Error("STRANGE ERROR: CHECK TITLE: YES!");
        title = Model.Fields["title"].Value;
    }
    else
    {
        // No, loop through what fields we have
        var ee = Model.Fields.GetEnumerator();
        while (ee.MoveNext())
        {
            logger.ErrorFormat("STRANGE ERROR: '{0}'", ee.Current.Key); // 'title' appears - but failed above WTF!!!!
            logger.ErrorFormat("STRANGE ERROR: {0}", ee.Current.Key.GetHashCode());            
        }

        string t = "title";
         logger.ErrorFormat("STRANGE ERROR: {0}", t.GetHashCode());
    }
}

<h3>@title</h3>

0 个答案:

没有答案