我一辈子都无法弄清楚为什么遗留代码会这样做:
HashSiteMapping.Add(""+sm.SiteNumber, sm.LocationNumber);
...当这似乎更明智时:
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber);
我只是耸耸肩膀,and住了这段代码的一般怪异之处,但是我在这段代码中发现“值不在预期范围内”,并且想知道这是否是问题所在。在更完整的上下文中,代码是这样的:
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" |
您当然不希望使所有这些混淆!
希望能有所帮助。
关于c# - 在HashTable.Add()前面添加一个空字符串是否可能是“值不在期望范围内”的罪魁祸首?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15776442/