Может ли добавление пустой строки к HashTable.Add() быть виновником "значение не попадает в ожидаемый диапазон"?

Я не могу понять, почему унаследованный код делает это так:

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

... но я все еще получаю, "значение не попадает в ожидаемый диапазон"

2 ответа

Решение

Я не знаком с 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"   |

Вы, конечно, не хотели бы запутать всех этих!

Надеюсь, это поможет.

Возможно, вы захотите подключить assert в отладочной сборке и наблюдать за значениями, которые нарушают что-то, определенное как "ожидаемый диапазон" для класса HashSiteMapping--

Другие вопросы по тегам