在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);
    }
}

…但我仍然得到,"值不落在预期范围内"

在HashTable.Add()中添加一个空字符串可能是“值不在预期范围内”的罪魁祸首吗?

我不熟悉HashSiteMapping。这是自定义类吗?能否提供链接或定义代码?

我最好的猜测是有你的SiteMapping SiteNumbernull或空的实例。在这种情况下,您的原始代码将像这样做:

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);
    }
}

请注意,即使上面的代码没有注释,发生的事情仍然比你留下的神秘代码更容易理解。

您尝试的第二个版本(如下所示)可能失败,因为SiteNumberLocationNumber一起创建了一种类型的复合键(再次我猜,因为我不知道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类的"预期范围"——