2

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

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

...但我仍然得到,“价值不在预期范围内”

4

2 回答 2

1

我不熟悉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"   |

你当然不想让所有这些都感到困惑!

希望有帮助。

于 2013-04-03T14:05:11.017 回答
0

您可能希望在调试构建中挂接一个断言,并注意违反 HashSiteMapping 类定义为“预期范围”的值 -

于 2013-04-03T00:20:07.637 回答