System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键

2023-12-26

对方法执行单元测试时,我收到上述错误消息。我知道问题出在哪里,只是不知道为什么字典中没有它。

这是字典:

var nmDict = xelem.Descendants(plantNS + "Month").ToDictionary(
    k => new Tuple<int, int, string>(int.Parse(k.Ancestors(plantNS + "Year").First().Attribute("Year").Value), Int32.Parse(k.Attribute("Month1").Value), k.Ancestors(plantNS + "Report").First().Attribute("Location").Value.ToString()),
    v => { 
             var detail = v.Descendants(plantNS + "Details").First();
             return new HoursContainer
             {
                 BaseHours = detail.Attribute("BaseHours").Value,
                 OvertimeHours = detail.Attribute("OvertimeHours").Value,
                 TotalHours = float.Parse(detail.Attribute("BaseHours").Value) + float.Parse(detail.Attribute("OvertimeHours").Value)
             };
         });
        
var mergedDict = new Dictionary<Tuple<int, int, string>, HoursContainer>();

foreach (var item in nmDict)
{
    mergedDict.Add(Tuple.Create(item.Key.Item1, item.Key.Item2, "NM"), item.Value);
}


var thDict = xelem.Descendants(plantNS + "Month").ToDictionary(
    k => new Tuple<int, int, string>(int.Parse(k.Ancestors(plantNS + "Year").First().Attribute("Year").Value), Int32.Parse(k.Attribute("Month1").Value), k.Ancestors(plantNS + "Report").First().Attribute("Location").Value.ToString()),
    v => {
             var detail = v.Descendants(plantNS + "Details").First();
             return new HoursContainer
             {
                 BaseHours = detail.Attribute("BaseHours").Value,
                 OvertimeHours = detail.Attribute("OvertimeHours").Value,
                 TotalHours = float.Parse(detail.Attribute("BaseHours").Value) + float.Parse(detail.Attribute("OvertimeHours").Value)
             };
         });

foreach (var item in thDict)
{
    mergedDict.Add(Tuple.Create(item.Key.Item1, item.Key.Item2, "TH"), item.Value);
}
return mergedDict;                                 

这是正在测试的方法:

protected IList<DataResults> QueryData(HarvestTargetTimeRangeUTC ranges,
        IDictionary<Tuple<int, int, string>, HoursContainer> mergedDict)
{            
    var startDate = new DateTime(ranges.StartTimeUTC.Year, ranges.StartTimeUTC.Month, 1);
    var endDate = new DateTime(ranges.EndTimeUTC.Year, ranges.EndTimeUTC.Month, 1);
    const string IndicatorName = "{6B5B57F6-A9FC-48AB-BA4C-9AB5A16F3745}";
        
    DataResults endItem = new DataResults();
    List<DataResults> ListOfResults = new List<DataResults>();                               

    var allData =

    (from vi in context.vDimIncidents
    where vi.IncidentDate >= startDate.AddYears(-3) && vi.IncidentDate <= endDate
        select new
        {
            vi.IncidentDate,
            LocationName = vi.LocationCode,
            GroupingName = vi.Location,
            vi.ThisIncidentIs, vi.Location
        });

    var finalResults = 

            (from a in allData
            group a by new { a.IncidentDate.Year, a.IncidentDate.Month, a.LocationName, a.GroupingName, a.ThisIncidentIs, a.Location }
                into groupItem
            select new 
            {
                Year = String.Format("{0}", groupItem.Key.Year),
                Month = String.Format("{0:00}", groupItem.Key.Month),
                groupItem.Key.LocationName,
                GroupingName = groupItem.Key.GroupingName,
                Numerator = groupItem.Count(),
                Denominator = mergedDict[Tuple.Create(groupItem.Key.Year, groupItem.Key.Month, groupItem.Key.LocationName)].TotalHours,  
                IndicatorName = IndicatorName,                        
            }).ToList();


    for (int counter = 0; counter < finalResults.Count; counter++)
    {
        var item = finalResults[counter];
        endItem = new DataResults();
        ListOfResults.Add(endItem);
        endItem.IndicatorName = item.IndicatorName;
        endItem.LocationName = item.LocationName;
        endItem.Year = item.Year;
        endItem.Month = item.Month;
        endItem.GroupingName = item.GroupingName;
        endItem.Numerator = item.Numerator;
        endItem.Denominator = item.Denominator;               
    }

    foreach(var item in mergedDict)
    {
        if(!ListOfResults.Exists(l=> l.Year == item.Key.Item1.ToString() && l.Month == item.Key.Item2.ToString()
                && l.LocationName == item.Key.Item3))
        {
            for (int counter = 0; counter < finalResults.Count; counter++)
            {
                var data = finalResults[counter];
                endItem = new DataResults();
                ListOfResults.Add(endItem);
                endItem.IndicatorName = data.IndicatorName; 
                endItem.LocationName = item.Key.Item3;
                endItem.Year = item.Key.Item1.ToString();
                endItem.Month = item.Key.Item2.ToString();
                endItem.GroupingName = data.GroupingName; 
                endItem.Numerator = 0;
                endItem.Denominator = item.Value.TotalHours;
            }
        }
    }
    return ListOfResults;
}

错误发生在这里:

Denominator = mergedDict[Tuple.Create(groupItem.Key.Year, groupItem.Key.Month, groupItem.Key.LocationName)].TotalHours,  

我不明白为什么它不存在于密钥中。关键在于int, int, string (year, month, location)这就是我所分配的。

我已经查看了与此错误消息相关的所有其他线程,但没有看到任何适用于我的情况的内容。

我不确定要在上面添加什么标签,但根据我的理解,字典是使用 linq to xml 创建的,查询是 linq to sql 并且它都是 C# 的一部分,所以我使用了所有标签。如果这是不正确的,那么我提前道歉。


问题在于您存储在的密钥之间的比较Dictionary以及您要查找的键。

当你添加一些东西到Dictionary或访问a的索引器Dictionary它使用GetHashCode()方法来获取密钥的哈希值。 a 的哈希码Tuple对于该实例来说是唯一的Tuple。这意味着除非您传递完全相同的实例Tuple类进入索引器时,它不会找到以前存储的值。您的使用情况mergedDict[Tuple.Create(...创建一个全新的元组,其哈希码与存储在元组中的哈希码不同Dictionary.

我建议创建您自己的类作为密钥并实现GetHashCode()以及该类的 Equality 方法。这样,词典就能找到您之前存储的内容。

更多的: 这让很多人感到困惑的原因是,对于类似的事情String or Int32, String.GetHashCode()将为具有相同值的两个不同实例返回相同的哈希码。更专业的类,例如Tuple并不总是一样工作。的实施者Tuple可以获得每个输入的哈希码Tuple并将它们添加在一起(或其他东西),但是通过反编译器运行 Tuple 你可以看到情况并非如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 如何使用 IPython 表示图形

    最近我发现IPython notebook这是一个强大的工具 作为一名 IT 学生 我一直在寻找一种用 Python 表示图形的方法 例如 我想知道是否有一个图书馆 例如numpy or matplotlib 从中可以得出 1 3 2 2
  • JPA 中的瞬态字段和查询中的设置

    我们如何从选择查询中加载 JPA 中的瞬态字段 例如我有这个查询 SELECT table1 SELECT SUM field from table2 WHERE theField table1 flag as total FROM tab
  • 为什么 C# 中某些迭代器比其他迭代器更快?

    有些迭代器速度更快 我发现这一点是因为我收到鲍勃 塔博尔 Bob Tabor 的来信9频道 http channel9 msdn com 永远不要复制和粘贴 我习惯于这样做来设置数组值 testArray 0 0 testArray 1 1
  • 如何在行为测试.feature 文件的示例表中使用管道字符?

    我有一个行为场景大纲 我需要使用管道字符 作为示例表中的单元格值 但我不知道如何转义这个字符 以免被视为列分隔符 我越来越Malformed table当我尝试使用时出错 顺序 据我所知 从 1 2 5 版本 发布时的当前版本 开始 不可能
  • 如何在函数中编写函数(list_map)

    你好 我最近问了一些关于C中链表的问题 链接是在这里找到的 https stackoverflow com questions 2106691 c issue cant figure how to assign pointer to beg
  • 何时以及为何使用一组 Executor

    我一直在阅读 Android 文档中有关 Executor 的内容 如果我理解正确的话 它用于多线程管理 并且它会为您完成一些工作 例如在需要时生成新线程 或者您可以选择自己管理事情 在下面的示例中 使用一组执行器而不是一个执行器 所以它就
  • 如何在Python中更新字典中键的值?

    我有一本代表书店的字典 键代表书名 值代表当前书籍的份数 当书籍从商店出售时 书籍的册数必须减少 我编写了一个代码来减少已售书籍的副本数量 但是在更新后打印词典时 我得到的是初始词典 而不是更新后的词典 n input Enter numb
  • 使用端口 Ping ip,不返回任何内容,PHP/APACHE

    我正在使用以下命令来获取 IP 或域的状态 我如何 ping 端口 80 提供端口后 根本不返回任何内容 尝试通过 80 和 80 将其添加到末尾 任何想法表示赞赏 如果您想要了解给定主机是否接受端口 80 上的 TCP 连接 您可以这样做
  • Android Studio 找不到 AndroidManifest.xml

    我正在使用 Android Studio v0 2 x 我刚刚创建了一个具有默认设置的新应用程序 File gt 新项目 gt 然后一步步进行 当我构建它时 它失败了 日志是 Android 源生成器 MyApplication Andro
  • Maven 版本控制和发布 GIT 存储库

    我在一个 GIT 存储库中有多个 Maven 项目 我想对 Maven 项目执行单独的发布 将发布版本推送到 Nexus 跳过标记并增加快照和提交 使用的 Maven 发布目标 release clean release prepare r
  • Android - 无法打开 zip 存档

    我正在从网络下载 apk 文件并将其存储到 Context getCacheDir 中 我正在通过 HttpURLConnection 下载文件 我实际上并没有询问代码 它完全正常工作 所以我不会将其发布在这里 我成功启动下载 文件被下载到
  • 将频率表合并到单个数据框中

    我有一个列表 其中每个列表项都是一个词频表 该表是通过在不同的示例文本上使用 table 而派生的 因此 每个表的长度不同 我现在想将列表转换为单个数据框 其中每列都是一个单词 每行都是示例文本 这是我的数据的虚拟示例 t1 lt tabl
  • RSpec 错误“未初始化常量 FactoryGirl(名称错误)”

    我尝试运行 RSpec 测试 rspec comments rb 但不断收到相同的错误 见标题 在有人问之前我已经添加了require factory girl到spec helper rb 的内容spec factories commen
  • 为什么我无法在 Raspberry Pi 上安装任何带有 GHC 7.8.4 的软件包?

    根据这个帖子 http www reddit com r haskell comments 35bw0b at last debian unstable has working arm ghci and 终于有一个支持模板 haskell
  • ASP.Net MVC 3.0 Ajax.ActionLink Onbegin 函数 true 执行操作?

    我有一个 Ajax Action 链接 它将调用一个 action 方法 在我的 Ajax 选项中 我调用了一个验证函数 如果这个函数返回 true 那么只有我想要执行此操作 不知道如何完成此操作 我的 Ajax ActionLink Aj
  • android 未加载广告时使用空间

    我正在尝试在我的应用程序中添加 admob 广告 但是当我没有连接到互联网时 那里的空间太空了 我希望添加在加载后出现 直到广告空间应由其余元素利用 该怎么办 我的活动文件如下 MainActivity java package com t
  • LL(1) 不能有歧义

    如何证明 LL 1 文法不能是二义性的 我知道什么是二义性语法 但无法证明上述定理 引理 这是我的校样初稿 它可能需要一些微调 但我认为它涵盖了所有情况 我认为许多解决方案都是可能的 这是一个直接的证明 旁注 遗憾的是 SO 不支持数学 例
  • 在字符串中使用希伯来字符

    我想在 R 的字符串中使用希伯来字符 我使用了以下内容 gt a lt c gt a 1 gt class a 1 character 可以看出 当我输出字符串内容或使用任何函数时 我会得到 Jibbrish 如何使用希伯来语字符 感谢所有
  • 高效适配器有java.lang.ClassCastException吗?

    看完后here http www google com events io 2009 sessions TurboChargeUiAndroidFast html我尝试实现自己的高效适配器 我的 ViewHolder 类几乎相同 stati
  • System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键

    对方法执行单元测试时 我收到上述错误消息 我知道问题出在哪里 只是不知道为什么字典中没有它 这是字典 var nmDict xelem Descendants plantNS Month ToDictionary k gt new Tupl