我一辈子都无法弄清楚为什么遗留代码会这样做:

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


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

您尝试的第二个版本(如下所示)可能会失败,因为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/

10-10 18:36