Может ли добавление пустой строки к 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--