在HashTable.Add()中添加一个空字符串可能是“值不在预期范围内”的罪魁祸首吗?
本文关键字:范围内 罪魁祸首 添加 Add HashTable 字符串 一个 | 更新日期: 2023-09-27 18:07:04
我一辈子也弄不明白为什么遗留代码会这样做:
HashSiteMapping.Add(""+sm.SiteNumber, sm.LocationNumber);
…当这看起来更合理时:
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber);
我只是耸耸肩,把它塞进这段代码的奇怪之处,但我在这段代码中得到"值不落在预期范围内",我想知道这是否可能是问题所在。在完整的上下文中,代码是:
IEnumerator en = mFile.Map.Mappings.GetEnumerator();
while (en.MoveNext())
{
SiteMapping sm = (SiteMapping) en.Current;
HashSiteMapping.Add(""+sm.SiteNumber, sm.LocationNumber);
}
…我把它改成了:
IEnumerator en = mFile.Map.Mappings.GetEnumerator();
while (en.MoveNext())
{
SiteMapping sm = (SiteMapping) en.Current;
if (!HashSiteMapping.Contains(sm.SiteNumber))
{
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber);
}
}
…但我仍然得到,"值不落在预期范围内"
我不熟悉HashSiteMapping。这是自定义类吗?能否提供链接或定义代码?
我最好的猜测是有你的SiteMapping SiteNumber
是null
或空的实例。在这种情况下,您的原始代码将像这样做:
IEnumerator en = mFile.Map.Mappings.GetEnumerator();
while (en.MoveNext())
{
SiteMapping sm = (SiteMapping) en.Current;
if (String.IsNullOrEmpty(sm.SiteNumber))
{
HashSiteMapping.Add(String.Empty, sm.LocationNumber);
}
else
{
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber);
}
}
请注意,即使上面的代码没有注释,发生的事情仍然比你留下的神秘代码更容易理解。
您尝试的第二个版本(如下所示)可能失败,因为SiteNumber和LocationNumber一起创建了一种类型的复合键(再次我猜,因为我不知道HashSiteMapping定义)
while (en.MoveNext())
{
SiteMapping sm = (SiteMapping) en.Current;
if (!HashSiteMapping.Contains(sm.SiteNumber))
{
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber); // What if LocationNumber has not been included yet?
}
}
考虑:
|_SiteNumber__|_LocationNumber_|
| "Warehouse" | "A1" |
| "Warehouse" | "B1" |
| NULL | "Boss'sOffice" |
| NULL |"JanitorCloset" |
| NULL | "RestRoom" |
你肯定不想把这些都弄混了!
希望对你有帮助。
您可能希望在调试构建中钩入一个断言,并监视违反的值定义为HashSiteMapping类的"预期范围"——