gpt4 book ai didi

c# - System.Collections.Generic.KeyNotFoundException : The given key was not present in the dictionary

转载 作者:太空狗 更新时间:2023-10-29 22:53:08 24 4
gpt4 key购买 nike

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

这是字典:

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,  

我不明白为什么 key 中没有它。 key 由 int, int, string (year, month, location) 组成,这就是我分配给它的内容。

我查看了与此错误消息相关的所有其他主题,但没有发现任何适用于我的情况的内容。

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

最佳答案

问题在于您存储在 Dictionary 中的键与您尝试查找的键之间的比较。

当您向 Dictionary 添加内容或访问 Dictionary 的索引器时,它会使用 GetHashCode() 方法获取哈希值的关键。 Tuple 的哈希码对于 Tuple 的实例是唯一的。这意味着除非您将 Tuple 类的完全相同的实例传递给索引器,否则它不会找到以前存储的值。您对 mergedDict[Tuple.Create(... 的使用创建了一个全新的元组,其哈希码与存储在 Dictionary 中的不同。

我建议创建您自己的类用作键并在该类上实现 GetHashCode() 和 Equality 方法。这样,词典将能够找到您之前存储在那里的内容。

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

关于c# - System.Collections.Generic.KeyNotFoundException : The given key was not present in the dictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com